在bash中处理文件名中的空格

时间:2014-08-01 11:58:13

标签: linux bash unix

我有这个目录结构:

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

如何处理目录和空间中的空格?文件名在这种情况下?是否可以没有使用循环?

4 个答案:

答案 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