我有这个目录结构:
ParentDir
|
-- Child Dir1
|
-- File One.txt
-- File
|
-- Child Dir2
|
-- File Two.txt
-- File
我试图找出所有.txt
个文件并计算其中行数的总和,所以我做了类似的事情:
TXTFILES=$(find . -name '*.txt')
cat $TXTFILES | wc -l
但问题是,我明白了,
cat: ./Child: No such file or directory
cat: Dir2/File: No such file or directory
cat: Two.txt: No such file or directory
cat: ./Child: No such file or directory
cat: Dir1/File: No such file or directory
cat: One.txt: No such file or directory
如何处理目录和空间中的空格?文件名在这种情况下?是否可以没有使用循环?
答案 0 :(得分:4)
如果您不需要将文件名存储在变量中,可以在一行中执行此操作:
find . -name '*.txt' -print0 | xargs -0 wc -l
find
支持-print0
选项,使其使用空字节而不是空格来分隔文件名。 xargs
支持-0
(连字符零)开关,告诉它传入的文件名由空字节而不是空格分隔。
答案 1 :(得分:3)
find . -name '*.txt' -exec cat -- '{}' ';' | wc -l
这会为每个文件单独运行cat
(不太理想),但文件名直接从find
传递到cat
,而不会被shell解析。因此,文件名可能是命令行中存在问题的任何内容。
答案 2 :(得分:0)
又脏又快:
ls -1FR|grep -c '\.txt$'
的zsh:
ls **/*.txt|wc -l
答案 3 :(得分:0)
您可以通过"围绕文件名路径。 "像这样
find . -name '*.txt' | sed -e 's/^/"/g' -e 's/$/"/g' | wc -l
示例:
prompt$ touch a.txt "a a.txt"
prompt$ find . -name '*.txt' | sed -e 's/^/"/g' -e 's/$/"/g'
"./a a.txt"
"./a.txt"
prompt$ find . -name '*.txt' | sed -e 's/^/"/g' -e 's/$/"/g' | wc -l
2