如何删除目录中具有多于或少于指定行数的文件(所有文件都有“.txt”后缀)?
答案 0 :(得分:11)
这个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
答案 1 :(得分:4)
玩了一下0x6adb015的答案。这对我有用:
LINES=10
for f in *.txt; do
a=`cat "$f" | wc -l`;
if [ "$a" -ne "$LINES" ]
then
rm -f "$f"
fi
done
答案 2 :(得分:3)
这个班轮也应该
find -name '*.txt' | xargs wc -l | awk '{if($1 > 1000 && index($2, "txt")>0 ) print $2}' | xargs rm
在上面的示例中,将删除大于1000行的文件。
选择>和<和相应的行数。
答案 3 :(得分:1)
试试这个bash脚本:
LINES=10
for f in *.txt; do
if [ `cat "$f" | wc -l` -ne $LINES ]; then
rm -f "$f"
fi
done
(未经测试)
编辑:使用管道输入wc,因为wc也会打印文件名。
答案 4 :(得分:1)
我的命令行mashing非常生疏,但我认为这样的东西可以安全地工作(将“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
答案 5 :(得分:0)
这是一个单行选项。 RLINES
是要用于删除的行数。
rm \`find $DIR -type f -exec wc -l {} \; | grep "^$RLINES " | awk '{print $2}'\`
答案 6 :(得分:0)
问题提出后有点晚了。我刚才有同样的问题,这就是Chad Campbell
中提出的问题find $DIR -name '*.txt' -exec wc -l {} \; | grep -v "$LINES" | awk '{print $2}' | xargs rm