如何移动目录中行数少于指定值的文件?find+awk命令失效求解决方案
问题原因
- 逻辑反向:现有awk的返回值逻辑刚好和需求相反。你的awk规则是当文件行数超过6行时返回执行成功状态码0,行数≤6时返回状态码1,而find的
-exec是只有前序命令返回0才会执行后续动作,所以根本不会匹配到你要的<6行的文件。 - mv参数顺序错误:Linux下mv命令的语法是
mv [源文件路径] [目标路径],你写的mv output_folder/ {}会尝试把目标文件夹移动到源文件位置,语法完全错误。 - 测试用echo未移除:你在mv前加了echo,运行时只会打印命令不会实际执行移动操作,确认逻辑正确后需要删掉echo。
可行解决方案
修正后的原命令版本
# 先执行带echo的版本打印要移动的文件,确认没问题再去掉echo find /path/folder/ -type f -exec awk -v lines=6 'NR>lines{f=1; exit} END{exit f}' {} \; -exec echo mv {} output_folder/ \;
说明:仅修改了awk的END块返回值为exit f,同时修正了mv的参数顺序,匹配逻辑变成:文件行数≤6时awk返回0,触发后续mv操作,空文件也会被正常匹配移动。
更易读的wc统计版本(推荐新手使用)
如果对awk逻辑不熟悉,用wc统计行数的写法更容易理解和排查问题:
# 先打印确认要移动的文件列表 find /path/folder/ -type f -exec bash -c ' [ $(wc -l < "$1") -lt 6 ] ' _ {} \; -print # 确认无误后执行实际移动 find /path/folder/ -type f -exec bash -c ' [ $(wc -l < "$1") -lt 6 ] ' _ {} \; -exec mv {} output_folder/ \;
注意事项
执行前优先用打印命令确认要操作的文件列表,避免误移动重要文件;如果需要保留子目录结构移动,需要提前在目标文件夹创建对应层级的目录。
内容的提问来源于stack exchange,提问作者Nono_sad
相关产品推荐
相关产品推荐

