web-dev-qa-db-ja.com

スペースで返されたファイルのディスク使用量を確認する

findが出力するファイルのコレクションの合計ディスク容量を出力したいと思います。

私のファイルの1つは、名前にスペースが含まれているため、duから「そのようなファイルまたはディレクトリはありません」というメッセージが返されます。

[email protected]:/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が空白でファイル名を認識できません。

これが機能するので少し混乱します:

[email protected]:/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

しかし、これはしません:

[email protected]:/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

これに対処するより良い方法はありますか?

7
Chris

Findにファイル名を処理させたらどうなるでしょうか?

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

これはどう?:

find。-maxdepth 1 -iname '* syed *' -print0 | xargs -0 du -ch

オプションの説明:

  • find –ファイルの検索に使用していたもの
    • -print0 –各結果をヌル文字(ファイル名には使用できない文字)で分割します
  • xargs –標準入力(stdin)からパイプされたコマンドに引数をアセンブルします
    • -0 –ヌル文字で分割された各引数を受け取ります
    • du -ch –ファイル引数を渡したいコマンド

提案されたsedのエスケープ方法が機能しない理由については、\追加しようとしている文字は、シェル引数の区切り文字( "")のエスケープが既に行われた後に配置されます。スペースで区切られた各Wordはすでに議論の的となっています。

xargsを使用した私の解決策では、スペースに関係なく、各引数がfindからのパスであることを確認します。

12
Deltik