GNUとUnixのコマンド
あるディレクトリ配下に数万個のファイルが存在し、その中から拡張子が「.tmp」であるファイルすべてに対してchmod 600を適用したい。ファイル数が多いためコマンドライン引数の上限エラーを避けつつ実行するために適切なコマンドはどれか。
- Achmod 600 $(find . -name "*.tmp")
- Bfind . -name "*.tmp" | chmod 600
- ✓find . -name "*.tmp" -print0 | xargs -0 chmod 600
- Dls *.tmp | chmod 600
解説
find -print0とxargs -0を組み合わせることで、大量のファイル名をNULL区切りで安全に受け渡しつつ、コマンドライン引数の長さ上限を超えないよう複数回に分けてchmodを実行できる。コマンド置換で引数を直接展開する方法は引数が多いと上限エラーになる可能性があり、単純なパイプではchmodが標準入力を引数として解釈しないため動作しない。
根拠GNUとUnixのコマンド - find, xargsの利用