Linux:删除不包含特定行数的文件

如何删除多于或less于指定行的目录(所有文件都有“.txt”后缀)的文件?

Solutions Collecting From Web of "Linux:删除不包含特定行数的文件"

这bash脚本应该做的伎俩。 保存为“rmlc.sh”。

示例用法:

rmlc.sh -more 20 *.txt # Remove all .txt files with more than 20 lines rmlc.sh -less 15 * # Remove ALL files with fewer than 15 lines 

请注意,如果rmlc.sh脚本位于当前目录中,它将受到保护而不受删除的保护。


 #!/bin/sh # rmlc.sh - Remove by line count SCRIPTNAME="rmlc.sh" IFS="" # Parse arguments if [ $# -lt 3 ]; then echo "Usage:" echo "$SCRIPTNAME [-more|-less] [numlines] file1 file2..." exit fi if [ $1 == "-more" ]; then COMPARE="-gt" elif [ $1 == "-less" ]; then COMPARE="-lt" else echo "First argument must be -more or -less" exit fi LINECOUNT=$2 # Discard non-filename arguments shift 2 for filename in $*; do # Make sure we're dealing with a regular file first if [ ! -f "$filename" ]; then echo "Ignoring $filename" continue fi # We probably don't want to delete ourselves if script is in current dir if [ "$filename" == "$SCRIPTNAME" ]; then continue fi # Feed wc with stdin so that output doesn't include filename lines=`cat "$filename" | wc -l` # Check criteria and delete if [ $lines $COMPARE $LINECOUNT ]; then echo "Deleting $filename" rm "$filename" fi done 

玩了一下0x6adb015的答案。 这适用于我:

 LINES=10 for f in *.txt; do a=`cat "$f" | wc -l`; if [ "$a" -ne "$LINES" ] then rm -f "$f" fi done 

这一班轮也应该这样做

  find -name '*.txt' | xargs wc -l | awk '{if($1 > 1000 && index($2, "txt")>0 ) print $2}' | xargs rm 

在上面的例子中,大于1000行的文件被删除。

选择>和<以及相应的行数。

试试这个bash脚本:

 LINES=10 for f in *.txt; do if [ `cat "$f" | wc -l` -ne $LINES ]; then rm -f "$f" fi done 

(未测试)

编辑:使用一个管饲料在wc,因为wc打印文件名以及。

我的命令行混合是相当生锈的,但我认为这样的东西可以安全地工作(即使文件名中有空格,将“10”更改为grep中的任意行)。 根据需要调整。 如果文件名中的换行符是可能的,你需要调整它。

 find . -name \*.txt -type f -exec wc -l {} \; | grep -v "^10 .*$" | cut --complement -f 1 -d " " | tr '\012' '\000' | xargs -0 rm -f 

这里是一个班轮选项。 RLINES是用于删除的行数。

 rm \`find $DIR -type f -exec wc -l {} \; | grep "^$RLINES " | awk '{print $2}'\` 

有人问这个问题有点迟了。 我刚才也有同样的问题,这就是乍得坎贝尔 ( Chad Campbell)的观点

 find $DIR -name '*.txt' -exec wc -l {} \; | grep -v "$LINES" | awk '{print $2}' | xargs rm 
  • 第一部分查找以* .txt结尾的所有文件,并打印行数。
  • 第二部分选择所有没有所需行数(LINES)的文件。
  • 第三部分只打印文件名。
  • 第四部分删除这些文件。