web-dev-qa-db-ja.com

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の組み合わせを使用するとエラーが発生するのはなぜですか。

4
RanRag

この場合、xargsは実際には必要ありません:du -h -- *.mkv | awk '{print $1}'

とにかく、あなたの問題を解決するためにls *.mkv | xargs du -h | awk '{print $1}'

enter image description here

私のために働く、bash4.2

3
daisy

xargsを使用すると、混乱する場合があります。確実に使用したい場合は、入力を\0で区切る必要があります。 e。

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

改行を\0sに変更するか、または変更します(最近のxargsがある場合)

ls | xargs -d \\n stat
4
glglgl

あなたの命令は少しルーブゴールドバーグ風です。ファイルのリストを取ります*.mkv。それらのファイルをリストします(印刷できない文字をおおよその表現に置き換える可能性があります)。リストを解析します(リストの生成方法と完全に一致しない解析ルールがいくつかあります)。解析された個々の要素をduコマンドに渡します(複数の引数を取ることができます)。

lsコマンドはワイルドカードを展開しませんが、展開するのはシェルです。 ls の出力を解析しないでください。実際には必要なく、何かが壊れることがよくあります。

xargsコマンドの入力形式は、他のコマンドが生成するものと一致しません。はい、それは奇妙です。 -Iを使用すると、xargsはインデントを無視します。そのため、最初のスペースが含まれるファイル名がマングルされます。 -0オプションを使用する場合、または入力に混乱を招く文字が含まれていないことがわかっている場合を除いて、xargsを使用しないでください。

書くだけ

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

lsの前に\を追加してみてください(例:\ls | xargs file)。

0
lzp00