合併症
以下は時々しか機能しません:
gzip -d `cat large_file_list`
3つの問題があります(bash
他のほとんどのBourneのようなシェルで):
ファイル名にスペースタブまたは改行文字が含まれている場合は失敗します($IFS
変更されていないと想定)。これは、シェルの単語分割のためです。
また、ファイル名にglob-active文字が含まれていると、失敗する可能性があります。これは、シェルがファイル名リストにパス名展開を適用するためです。
ファイル名がで始まる場合-
(POSIXLY_CORRECT=1
最初のファイルにのみ適用される場合)、またはファイル名がの場合も失敗します-
。
ファイル名が多すぎて1つのコマンドラインに収まらない場合も失敗します。
以下のコードには、上記のコードと同じ問題があります(4番目を除く)。
for file in `cat large_file_list`
do
gzip -d $file
done
信頼できるソリューション
あなたの場合はlarge_file_list
行ごとに1つのファイル名を持つ、と呼ばれるファイルは、-
それらの間ではなく、あなたがGNUシステムにしている場合、使用します。
xargs -rd'\n' gzip -d -- <large_file_list
-d'\n'
xargs
入力の各行を個別のファイル名として扱うように指示します。
-r
xargs
入力ファイルが空の場合、コマンドを実行しないように指示します。
--
告げるgzip
彼らが起動しても、次の引数がオプションとして扱われていないこと-
。-
それだけでは-
、呼び出されたファイルの代わりとして扱われ-
ます。
xargs
各コマンドラインに多くのファイル名を付けますが、コマンドラインの制限を超えるほど多くはありません。これにより、gzip
プロセスを開始しなければならない回数が減るため、これが高速になります。また、安全です。ファイル名も単語分割やパス名拡張から保護されます。
gzip
、システムでの起動にかかる時間、ファイルリスト内のファイル数、およびそれらのファイルのサイズによって異なります。