web-dev-qa-db-ja.com

コマンドライン:ファイル名のスペースを処理する方法

私は、テキストドキュメントfiles.txtにパスを保存した一連のファイルの合計サイズを測定しています。 files.txtの内容の例:

file1.txt
file2.txt
file3.txt

このシェルコマンドは、必要な出力を提供します。

$ du -hc $(cat files.txt)

スペースを含むファイル名がない限り、例:file 9.txt次に、du -hcスペースでファイル名を解析しようとします。 files.txtまたはShellコマンドのどこに引用符を入れても、正しく解析されません。代わりに何をすべきですか?

参考までに、私のファイルリストドキュメントは次のようなコマンドの出力です。

find ~/Dropbox/ -type f -iname "*.BMP" >> bmpfound.txt

私のシステムの詳細:MacOS、Terminal.appでoh-my-zshを使用

2
escapecharacter

find-print0オプションを活用し、xargs -0にパイプします。

find ~/Dropbox/ -type f -iname "*.BMP" -print0 | xargs -0 du -ch

あるいは、Gordon Davissonがコメントしたように、これは単純化できます。

find ~/Dropbox/ -type f -iname "*.BMP" -exec du -ch {} +

これらのいずれも、スペースを含むファイル名、または任意の方法の間抜けな文字で機能するはずです。

findの出力をパイプするのではなく、意図的にファイルにリダイレクトするつもりだったかどうかはわかりませんが、実際にファイルリストを保持したい場合は、代わりに次のようにすることができます。

xargs -0 du -ch < bmpfound.txt
3
ZeroKnight