检查返回带有空格的文件的磁盘使用情况

检查返回带有空格的文件的磁盘使用情况

我想输出 输出的文件集合的总磁盘空间find

我的一个文件的名称中有空格,导致du返回“没有此文件或目录”消息。

chris@chris-x1c6:/media/E/2Videos$ du -ch $(find . -maxdepth 1 -iname "*syed*")
du: cannot access './The': No such file or directory
du: cannot access 'Case': No such file or directory
du: cannot access 'Against': No such file or directory
du: cannot access 'Adnan': No such file or directory
du: cannot access 'Syed': No such file or directory
du: cannot access 'S01E01': No such file or directory
du: cannot access '1080p.WEB.H264-AMRAP.mkv': No such file or directory
4.0G    ./The.Case.Against.Adnan.Syed.S01E02.In.Between.the.Truth.1080p.AMZN.WEB-DL.DDP5.1.H.264-NTb.mkv
4.0G    ./The.Case.Against.Adnan.Syed.S01E03.1080p.WEB.H264-AMRAP.mkv
3.5G    ./The.Case.Against.Adnan.Syed.S01E04.Time.is.the.Killer.1080p.AMZN.WEB-DL.DDP5.1.H.264-NTb.mkv
12G total

我尝试通过管道处理空格sed,或者用引号括起文件名或者在空格中添加转义字符,但这两种方式都无法du识别带有空格的文件名。

这有点令人困惑,因为这是有效的:

chris@chris-x1c6:/media/E/2Videos$ du -ch ./The\ Case\ Against\ Adnan\ Syed\ S01E01\ 1080p.WEB.H264-AMRAP.mkv 
4.1G    ./The Case Against Adnan Syed S01E01 1080p.WEB.H264-AMRAP.mkv
4.1G    total

但事实并非如此:

chris@chris-x1c6:/media/E/2Videos$ du -ch $(find . -maxdepth 1 -iname "*syed*" | sed 's/ /\\ /g')
du: cannot access './The\': No such file or directory
du: cannot access 'Case\': No such file or directory
du: cannot access 'Against\': No such file or directory
du: cannot access 'Adnan\': No such file or directory
du: cannot access 'Syed\': No such file or directory
du: cannot access 'S01E01\': No such file or directory
du: cannot access '1080p.WEB.H264-AMRAP.mkv': No such file or directory
4.0G    ./The.Case.Against.Adnan.Syed.S01E02.In.Between.the.Truth.1080p.AMZN.WEB-DL.DDP5.1.H.264-NTb.mkv
4.0G    ./The.Case.Against.Adnan.Syed.S01E03.1080p.WEB.H264-AMRAP.mkv
3.5G    ./The.Case.Against.Adnan.Syed.S01E04.Time.is.the.Killer.1080p.AMZN.WEB-DL.DDP5.1.H.264-NTb.mkv
12G total

有没有更好的方法来解决这个问题?

答案1

如果我们让 find 处理文件名会怎么样?

find . -maxdepth 1 -iname '*syed*' -exec du -ch {} +

答案2

这个怎么样?:

查找 . -maxdepth 1 -iname '*syed*' -print0 | xargs -0 du -ch

选项解释:

  • find– 你使用什么来查找文件
    • -print0– 使用空字符分割每个结果,该字符是文件名中不能出现的字符。
  • xargs– 将从标准输入 (stdin) 传输到命令的参数组合起来
    • -0– 接收由空字符分割的每个参数
    • du -ch– 您要向其传递文件参数的命令

至于为什么你提出的sed转义方式不起作用,\你试图添加的字符是在 shell 参数分隔符 (" ") 转义已经发生之后放入的。每个由空格分隔的单词已经是一个参数。

我的解决方案是xargs确保每个参数都是来自的路径find,与空格无关。

相关内容