
一部のファイルの名前を含むファイルがあります。リスト内のファイルの合計サイズを知りたいです。
#cat filelist
/tmp-directory/connector_db_ connector_db
/tmp-directory/connector_db -connector_db
/tmp-directory/connector_db_connector_db
ご覧のとおり、ファイル名にはスペースが含まれています。もっと悪いのはハイフン(-)です。。次のコマンドを使用して、このファイルの合計サイズを見つけようとします。
#du -sch `cat filelist`
du: invalid option -- 'o'
du: invalid option -- 'n'
du: invalid option -- 'n'
du: invalid option -- 'e'
du: invalid option -- 't'
du: invalid option -- 'o'
du: invalid option -- 'r'
du: invalid option -- '_'
du: invalid maximum depth `b'
以下のように「」を追加しようとしましたが、試みも失敗しました。
#cat filelist
"/tmp-directory/connector_db_ connector_db"
"/tmp-directory/connector_db -connector_db"
"/tmp-directory/connector_db_connector_db"
#du -sch `cat filelist`
du: invalid option -- 'o'
du: invalid option -- 'n'
.....
しかし、これは効果があります。シェルから直接次のコマンドを使用する場合。
#du -sch "/tmp-directory/connector_db -connector_db"
0 /tmp-directory/connector_db -connector_db
0 total
それでは、このような状況に対処する方法は何ですか?私は持っていますファイル一覧合計3つのlacファイルがあります。悪いことに、「du -sch」はファイルリストが20,000個を超えるとリストを処理しません。私は分割コマンドを使ってリストを20000行に分割しました。3つのlacファイルサイズを簡単に見つけるための別の方法はありますか?
答え1
xargs -Ifile du -sch file <filelist
上記の呼び出しコードは、ファイル名に改行文字が含まれていない限りdu -sch
呼び出されますfilelist
。 -Ifile
これにより、コマンドの文字列がから読み取られた各名前に置き換えられますxargs
。file
du -sch file
filelist
これにより、スペースとシェルのグローブパターンを含むファイル名が正しく処理されます(パターンは拡張されません)。
答え2
IFS
コマンド置換の周りに引用符を追加しなかったため、ここでは値(デフォルトではスペース、タブ、改行)に基づいて単語分割が行われます。ファイル名にスペースがあるため、/tmp-directory/connector_db_ connector_db
2つの単語に分割されます(/tmp-directory/connector_db_
例connector_db
:。
ファイル名を1つずつ繰り返すことができます。
while IFS= read -r file; do du -sch -- "$file"; done <filelist
ファイルが大きいため、時間がかかる場合があります。
また、ファイルは個別に解析されるため、フルサイズは表示されませんdu
。したがって、以下-s
を削除できます-c
。
while IFS= read -r file; do du -h -- "$file"; done <filelist