find
が出力するファイルのコレクションの合計ディスク容量を出力したいと思います。
私のファイルの1つは、名前にスペースが含まれているため、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
これに対処するより良い方法はありますか?
Findにファイル名を処理させたらどうなるでしょうか?
find . -maxdepth 1 -iname '*syed*' -exec du -ch {} +
これはどう?:
find。-maxdepth 1 -iname '* syed *' -print0 | xargs -0 du -ch
オプションの説明:
find
–ファイルの検索に使用していたもの-print0
–各結果をヌル文字(ファイル名には使用できない文字)で分割しますxargs
–標準入力(stdin)からパイプされたコマンドに引数をアセンブルします-0
–ヌル文字で分割された各引数を受け取りますdu -ch
–ファイル引数を渡したいコマンド提案されたsed
のエスケープ方法が機能しない理由については、\
追加しようとしている文字は、シェル引数の区切り文字( "")のエスケープが既に行われた後に配置されます。スペースで区切られた各Wordはすでに議論の的となっています。
xargs
を使用した私の解決策では、スペースに関係なく、各引数がfind
からのパスであることを確認します。