【问题标题】:Handling spaces in filenames in bash在 bash 中处理文件名中的空格
【发布时间】:2014-08-01 21:38:24
【问题描述】:

我有这个目录结构:

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

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

【问题讨论】:

    标签: linux bash unix


    【解决方案1】:

    如果您不需要将文件名存储在变量中,您可以在 1 行中执行此操作:

    find . -name '*.txt' -print0 | xargs -0 wc -l
    

    find 支持-print0 选项,使其使用空字节而不是空格来分隔文件名。 xargs 支持-0(连字符零)开关,告诉它传入的文件名由空字节而不是空格分隔。

    【讨论】:

    • ... | xargs -0 cat -- | wc -l 会产生更像 OP 正在寻找的输出。
    • @Kenster - 是的,完美。
    【解决方案2】:
    find . -name '*.txt' -exec cat -- '{}' ';' | wc -l
    

    这会为每个文件单独运行cat(这不太理想),但文件名直接从find 传递到cat,而不被shell 解析。所以文件名可能是任何在命令行上有问题的东西。

    【讨论】:

    • 如果你使用+而不是;,它会尽可能将参数批处理到cat
    • 这行得通,输出与我期望的完全相同,并且格式与我期望的完全相同。 :)
    【解决方案3】:

    又脏又快:

    ls -1FR|grep -c '\.txt$'
    

    zsh:

    ls **/*.txt|wc -l
    

    【讨论】:

    • 如果使用shopt -s globstar,第二个也可以在bash 4.x 中使用,尽管在任一shell 中您都可以(并且应该)改用wc -l **/*.txt
    • @chepner wc -l **/*.txt 做的不是ls **/*.txt|wc -l,不是吗?
    • wc -l **/*.txtcat **/*.txt | wc -l 略有不同,尽管所有文件的总行长都显示在输出中。 ls **/*.txt | wc -l 与 OP 要求的完全不同;它给出了匹配文件的数量。
    • @chepner 啊!!!!我误解了这个问题。我以为他想要结果ls ..|wc -l ....我的坏...待删除
    【解决方案4】:

    你可以像这样用“”包围你的文件名路径

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多