拡張子が.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
の組み合わせを使用するとエラーが発生するのはなぜですか。
この場合、xargsは実際には必要ありません:du -h -- *.mkv | awk '{print $1}'
とにかく、あなたの問題を解決するためにls *.mkv | xargs du -h | awk '{print $1}'
私のために働く、bash4.2
xargs
を使用すると、混乱する場合があります。確実に使用したい場合は、入力を\0
で区切る必要があります。 e。
ls | tr \\n \\0 | xargs -0 stat
改行を\0
sに変更するか、または変更します(最近のxargs
がある場合)
ls | xargs -d \\n stat
あなたの命令は少しルーブゴールドバーグ風です。ファイルのリストを取ります*.mkv
。それらのファイルをリストします(印刷できない文字をおおよその表現に置き換える可能性があります)。リストを解析します(リストの生成方法と完全に一致しない解析ルールがいくつかあります)。解析された個々の要素をdu
コマンドに渡します(複数の引数を取ることができます)。
ls
コマンドはワイルドカードを展開しませんが、展開するのはシェルです。 ls
の出力を解析しないでください。実際には必要なく、何かが壊れることがよくあります。
xargs
コマンドの入力形式は、他のコマンドが生成するものと一致しません。はい、それは奇妙です。 -I
を使用すると、xargs
はインデントを無視します。そのため、最初のスペースが含まれるファイル名がマングルされます。 -0
オプションを使用する場合、または入力に混乱を招く文字が含まれていないことがわかっている場合を除いて、xargs
を使用しないでください。
書くだけ
du -h *.mkv | awk '{print $1}'
ls
の前に\
を追加してみてください(例:\ls | xargs file
)。