使用xargs时没有这样的文件或目录错误

使用xargs时没有这样的文件或目录错误

我有一些带有.mkv扩展名的文件,我想使用du -h.有些文件前面有whitespace字符。

ranveer@ranveer:~$ ls *.mkv
Arrow.S01E02.720p.HDTV.X264-DIMENSION_(1)  [SHYAMPAREEK.IN].mkv
mymediafirefreefreak.com_The.Mentalist.S05E04.480p.HDTV.X264-mRS.mkv
SHYAMPAREEK.IN-The.Vampire.Diaries.S04E02.720p.HDTV.X264-DIMENSION_(1).mkv
Supernatural.S08E03.720p.HDTV.X264-DIMENSION_(1)SHYAMPAREEK.IN].mkv
  [WWW.SHYAMPAREEK.IN].Arrow S01E01 480p HDTV.mkv
 [WWW.SHYAMPAREEK.IN].Castle.2009.S05E03.480p.HDTV.x264-mSD.mkv
ranveer@ranveer:~$ 

现在,我用于xargs应用du -h到每个文件,但对于前面有字符的文件,whitespace我收到No such file or directory错误。

ranveer@ranveer:~$ ls *.mkv | xargs -I f du -h "f" | awk '{print $1}'
du: cannot access `[WWW.SHYAMPAREEK.IN].Arrow S01E01 480p HDTV.mkv': No such file or directory
du: cannot access `[WWW.SHYAMPAREEK.IN].Castle.2009.S05E03.480p.HDTV.x264-mSD.mkv': No such file or directory
186M
151M
185M
186M
ranveer@ranveer:~$ 

但是当我du -h单独应用这些文件时,它工作得很好。

ranveer@ranveer:~$ du -h "  [WWW.SHYAMPAREEK.IN].Arrow S01E01 480p HDTV.mkv"
151M      [WWW.SHYAMPAREEK.IN].Arrow S01E01 480p HDTV.mkv
ranveer@ranveer:~$ 

那么,为什么我在使用xargs & du -h.

答案1

使用xargs有时会令人困惑。如果你想可靠地使用它,你要么应该将它的输入分开\0,即

ls | tr \\n \\0 | xargs -0 stat

为了将换行符更改为\0s,或者执行(如果您最近有xargs

ls | xargs -d \\n stat

答案2

在这种情况下,你实际上并不需要 xargs:du -h -- *.mkv | awk '{print $1}'

无论如何,解决你的问题ls *.mkv | xargs du -h | awk '{print $1}'

在此输入图像描述

对我有用,bash4.2

答案3

你的命令有点鲁布·戈德堡式的。获取文件列表*.mkv。列出这些文件(可能用近似表示替换一些不可打印的字符)。解析列表(使用一些与列表生成方式不太匹配的解析规则)。将各个解析的元素传递给du命令(该命令能够接受多个参数)。

ls命令不会扩展通配符,而是 shell 会扩展通配符。不解析输出ls,它几乎从来不需要,而且经常会破坏一些东西。

该命令的输入格式xargs与任何其他命令生成的格式不匹配。是的,这很奇怪。使用-I,xargs会忽略缩进,这就是带有初始空格的文件名被破坏的原因。不要将xargsexcept 与该-0选项一起使用,或者当您知道您的输入不包含会造成混淆的字符时。

写吧

du -h *.mkv | awk '{print $1}'

答案4

我认为你需要“-0”。

https://man7.org/linux/man-pages/man1/xargs.1.html

由于 Unix 文件名可以包含空格和换行符,因此这种默认行为通常会出现问题; xargs 会错误地处理包含空格和/或换行符的文件名。在这些情况下,最好使用 -0 选项,这样可以防止出现此类问题。使用此选项时,您需要确保为 xargs 生成输入的程序也使用空字符作为分隔符。例如,如果该程序是 GNU find,则 -print0 选项会为您执行此操作。

相关内容