過去問ドリル

LinuCレベル1 GNUとUnixのコマンド 問33

GNUとUnixのコマンド/ストリーム、パイプ、リダイレクトの使用

カレントディレクトリ以下の *.tmp ファイルをすべて削除したい。ファイル名に空白が含まれていても正しく削除できるコマンドとして適切なものはどれか。

当サイトのオリジナル問題(LinuCレベル1の出題範囲「GNUとUnixのコマンド」に対応。実際の試験問題ではありません)

正解:B

解説

xargs は既定で空白や改行を区切りとして引数を分割するため、「my file.tmp」のような名前は「my」と「file.tmp」の2つに分かれてしまいます。find の -print0 はファイル名をヌル文字(\0)で区切って出力し、xargs の -0 はヌル文字だけを区切りとして読み取るので、両方を組み合わせると空白を含む名前も1つの引数として渡せます。ヌル文字はファイル名に使えない文字なので、この方法は確実です。find 単体で -delete や -exec rm {} + を使う方法もあります。

選択肢ごとの解説

  • A誤り。xargs が空白で名前を分割してしまうため、空白を含むファイル名が別々の引数になり、正しく削除できません。
  • B正しい。ヌル文字区切りで出力し、ヌル文字区切りで読み取るので、空白を含む名前も正しく渡せます。
  • C誤り。xargs に -0 が無いと、ヌル文字を区切りとして扱えないため、ファイル名を正しく分割できません。
  • D誤り。find が改行区切りで出力しているのに xargs -0 はヌル文字を待つため、全体が1つの引数として扱われてしまいます。
LinuCレベル1の問題を演習モードで解く