在 AIX 中移动只有 2 行的文件

Move files having only 2 lines in AIX

我有一个文件列表,我想将那些只包含两行的文件移动到另一个目录。

有没有办法在一条命令中完成?

我在 AIX 7.1 上。

取决于您所说的“单个命令”是什么意思,这是一个不寻常的要求。一般来说,您可以在通配符上使用 findfor 循环:

  • 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 循环使用 ./* 作为通配符的原因,因此所有扩展的文件名都以 ./ 开头,防止这些文件名以破折号开头。