在 AIX 中移动只有 2 行的文件
Posted
技术标签:
【中文标题】在 AIX 中移动只有 2 行的文件【英文标题】:Move files having only 2 lines in AIX 【发布时间】:2021-04-26 04:48:44 【问题描述】:我有一个文件列表,我想移动到另一个目录中只包含两行的文件。
有没有办法在一个命令中做到这一点?
我在 AIX 7.1 上。
【问题讨论】:
实用程序wc(1)
可能对选项 -l
有用
【参考方案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 以 ARG[0] 的形式给出“findshell”,只是作为一个占位符。其余参数在内部for
循环中进行检查;正好有两行的那些会被移动。
在for
解决方案中,我们遍历生成的文件列表并检查以确保我们正在查看常规文件[ -f "$f" ]
,并且该文件恰好包含两行。如果这两个条件都匹配,我们移动文件。
在所有mv
情况下,我们在提供文件名之前使用--
明确结束选项,这样恰好以-
破折号开头的文件名不会无意中被误认为是选项。这也是手动for
循环使用./*
作为通配符的原因,因此所有扩展文件名都以./
开头,从而防止这些文件名以破折号开头。
【讨论】:
以上是关于在 AIX 中移动只有 2 行的文件的主要内容,如果未能解决你的问题,请参考以下文章
AIX Unix find 命令获取第一个元素然后移动到下一个元素