在 AIX 中移动只有 2 行的文件
Move files having only 2 lines in AIX
我有一个文件列表,我想将那些只包含两行的文件移动到另一个目录。
有没有办法在一条命令中完成?
我在 AIX 7.1 上。
取决于您所说的“单个命令”是什么意思,这是一个不寻常的要求。一般来说,您可以在通配符上使用 find
或 for
循环:
和find
:
find . -type f -exec sh -c 'for f; do [ $(wc -l < "$f") -eq 2 ] && mv -- "$f" /target/dir/; done' findshell {} +
和for
:
for f in ./*; do [ -f "$f" ] && [ $(wc -l < "$f") -eq 2 ] && mv -- "$f" /target/dir; done
如果您有一个文件列表,例如可能带有 ksh93 和一个数组变量 -- files=( * )
,您可以遍历这些文件名:
for f in "${files[@]}"; do [ -f "$f" ] && [ $(wc -l < "$f") -eq 2 ] && mv -- "$f" /target/dir; done
在find
解决方案中,我们将结果限制为“文件”类型;对于其中的每一个,我们执行一个 shell 并包含尽可能多的参数(语法的 {} +
部分); shell 被赋予 'findshell' 作为 ARG[0],只是作为占位符。其余参数在内部 for
循环中检查;恰好有两行的那些被移动。
在 for
解决方案中,我们遍历生成的文件列表并检查以确保我们正在查看常规文件 [ -f "$f" ]
并且该文件恰好包含两行。如果这两个条件都匹配,我们将移动文件。
在所有 mv
情况下,我们在给出文件名之前使用 --
明确结束选项,这样恰好以 -
破折号开头的文件名不会无意中弄错作为选项。这也是手动 for
循环使用 ./*
作为通配符的原因,因此所有扩展的文件名都以 ./
开头,防止这些文件名以破折号开头。
我有一个文件列表,我想将那些只包含两行的文件移动到另一个目录。
有没有办法在一条命令中完成?
我在 AIX 7.1 上。
取决于您所说的“单个命令”是什么意思,这是一个不寻常的要求。一般来说,您可以在通配符上使用 find
或 for
循环:
和
find
:find . -type f -exec sh -c 'for f; do [ $(wc -l < "$f") -eq 2 ] && mv -- "$f" /target/dir/; done' findshell {} +
和
for
:for f in ./*; do [ -f "$f" ] && [ $(wc -l < "$f") -eq 2 ] && mv -- "$f" /target/dir; done
如果您有一个文件列表,例如可能带有 ksh93 和一个数组变量 -- files=( * )
,您可以遍历这些文件名:
for f in "${files[@]}"; do [ -f "$f" ] && [ $(wc -l < "$f") -eq 2 ] && mv -- "$f" /target/dir; done
在find
解决方案中,我们将结果限制为“文件”类型;对于其中的每一个,我们执行一个 shell 并包含尽可能多的参数(语法的 {} +
部分); shell 被赋予 'findshell' 作为 ARG[0],只是作为占位符。其余参数在内部 for
循环中检查;恰好有两行的那些被移动。
在 for
解决方案中,我们遍历生成的文件列表并检查以确保我们正在查看常规文件 [ -f "$f" ]
并且该文件恰好包含两行。如果这两个条件都匹配,我们将移动文件。
在所有 mv
情况下,我们在给出文件名之前使用 --
明确结束选项,这样恰好以 -
破折号开头的文件名不会无意中弄错作为选项。这也是手动 for
循环使用 ./*
作为通配符的原因,因此所有扩展的文件名都以 ./
开头,防止这些文件名以破折号开头。