在 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】:

取决于您所说的“单个命令”是什么意思,这是一个不寻常的要求。一般来说,您可以在通配符上使用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 以 ARG[0] 的形式给出“findshell”,只是作为一个占位符。其余参数在内部for 循环中进行检查;正好有两行的那些会被移动。

for 解决方案中,我们遍历生成的文件列表并检查以确保我们正在查看常规文件[ -f "$f" ],并且该文件恰好包含两行。如果这两个条件都匹配,我们移动文件。

在所有mv 情况下,我们在提供文件名之前使用-- 明确结束选项,这样恰好以- 破折号开头的文件名不会无意中被误认为是选项。这也是手动for 循环使用./* 作为通配符的原因,因此所有扩展文件名都以./ 开头,从而防止这些文件名以破折号开头。

【讨论】:

以上是关于在 AIX 中移动只有 2 行的文件的主要内容,如果未能解决你的问题,请参考以下文章

AIX Unix find 命令获取第一个元素然后移动到下一个元素

成功上传到 SFTP 服务器后删除本地 AIX 文件

如何启用移动但禁用 UITableView 中某些行的删除

QT中,QTableView鼠标移动到item上时该item所在行的背景颜色变成其他颜色,这要怎么实现

Vim快速移动光标至行首和行尾

来自日志文件的 grep 开始和结束时间 - AIX