我解决了写一个小脚本has_n_lines.sh
的问题,该脚本接收n
作为参数(在这种情况下是一组特定的txt
文件):
#!/bin/bash
files=`find . -name "*.txt"`
for file in $files
do
nlines=`wc -l $file | cut -d " " -f1`
if [ "$nlines" -eq "$1" ]
then
echo $file
fi
done
有没有更简单的方法呢?
由于
答案 0 :(得分:3)
是的,这样的事情可以解决问题
find . -name "*.txt" -exec bash -c 'wc -l < "$1"' -- {} \;
这样做当然是找到所有.txt
个文件。然后它通过逐个文件发送wc -l
来执行<
发送,{}
逐个文件使用。 \;
表示-exec
结束的位置。通过<
发送文件名使wc -l
只输出行数。现在您可以通过以下方式介绍比较:
find . -name "*.txt" -exec bash -c '(($(wc -l < "$1") == $n)) && echo "$1"' -- {} \;
其中$n
是您想要的行数。
说明(感谢John Kugelman):重定向(
<
)或if
语句不能直接与find ... -exec
一起使用。这意味着您需要显式调用子shell,您可以在其中使用它们。为了更加安全,--
为$0
,{}
为$1
,后者用于子shell。这可确保正确处理包含空格的文件名。在调用上述命令之前,您还需要
export $n
,因为子shell无法访问$n
。因此,如果您运行bash has_n_lines.sh 123
,其中123
是所需的行数,请将其添加到has_n_lines.sh
:n=$1 && export $n;
。
答案 1 :(得分:0)
或没有技巧:
vocabulary_cpp ❱ wc -l `find . -name '*.txt'`
24 ./iterator_01.txt
707 ./iterator_01_longman.txt
3122 ./algorithm_now_word.txt
113 ./list.txt
3966 total
vocabulary_cpp ❱ wc -l `find . -name '*.txt'` | grep -P "^ +24"
24 ./iterator_01.txt
vocabulary_cpp ❱
因此:
#!/bin/bash
wc -l `find . -name '*.txt'` | grep -P "^ +$1"
和
vocabulary_cpp ❱ ./test.sh 24
24 ./iterator_01.txt
vocabulary_cpp ❱