删除文件夹中包含超过14行的文件

时间:2014-07-02 22:54:51

标签: bash shell unix grep

使用的Unix命令

wc -l * | grep -v "14" | rm -rf

然而,这种分组似乎没有完成这项工作。任何人都能指出我正确的方法吗? 感谢

4 个答案:

答案 0 :(得分:2)

wc -l * 2>&1 | while read -r num file; do ((num > 14)) && echo rm "$file"; done

删除" echo"如果您对结果感到满意。

答案 1 :(得分:1)

这是打印出至少包含15行的所有文件名称的一种方法(假设你有nextfile命令的Gnu awk:

awk 'FNR==15{print FILENAME;nextfile}' *

这会对任何子目录产生错误,因此它并不理想。

但是,您实际上并不想打印文件名。你想删除它们。您可以使用awk函数在system中执行此操作:

# The following has been defanged in case someone decides to copy&paste
awk 'FNR==15{system("echo rm "FILENAME);nextfile}' *

答案 2 :(得分:1)

for f in *; do if [ $(wc -l $f | cut -d' ' -f1) -gt 14 ]; then rm -f $f; fi; done

答案 3 :(得分:0)

您的解决方案存在一些问题:rm没有从标准输入中获取输入,而您的grep只能查找不具备的文件 14行。试试这个:

find . -type f -maxdepth 1 | while read f; do [ `wc -l $f | tr -s ' ' | cut -d ' ' -f 2` -gt 14 ] && rm $f; done

以下是它的工作原理:

find . -type f -maxdepth 1    #all files (not directories) in the current directory
[                             #start comparison
wc -l $f                      #get line count of file
tr -s ' '                     #(on the output of wc) eliminate extra whitespace
cut -d ' ' -f 2               #pick just the line count out of the previous output
-gt 14 ]                      #test if all that was greater than 14
&& rm $f                      #if the comparison was true, delete the file

我试图找出一个只使用find-exec的解决方案,但我无法找到测试行数的方法。也许其他人可以想出办法