我正在使用下面的bash行在子文件夹中查找带有给定模式的文本文件,并将其移动到子文件夹:
find originalFolder/ -maxdepth 1 -type f -exec grep -q 'mySpecificPattern' {} \; -exec mv -i {} destinationFolder/ \;
现在,如果不是仅复制一行,我想将文件移动到子文件夹中,如果它们仅由一行(文本)组成:我该怎么做?
答案 0 :(得分:1)
您可以这样做:
while IFS= read -r -d '' file; do
[[ $(wc -l < "$file") -eq 1 ]] && echo mv -i "$file" destinationFolder/
done < <(find originalFolder/ -maxdepth 1 -type f -print0)
请注意在echo
前面使用mv
,以便您可以在实际执行mv
之前验证输出。对输出感到满意后,请在echo
之前删除mv
。
答案 1 :(得分:0)
使用上面所示的wc
是最直接的方法,尽管它会读取整个文件以确定长度。也可以使用awk
进行长度检查,而exit
函数使您可以将其适合find命令。
find . -type f -exec awk 'END { exit (NR==1 ? 0 : 1) } NR==2 { exit 1 }' {} \; -print
如果在文件末尾只有1条输入记录,则该命令返回状态0,并且在遇到第2行时也立即以状态1退出;否则,返回0。如果大文件是性能方面的考虑,那么这应该很容易超过wc
。