複雑なパイプしたい(xargs

$ コマンド | xargs コマンド

xargsコマンドで、あるコマンドの実行結果を引数にして、つぎのコマンドに渡すことだできます。 パイプとはちょっと違うと思いますが、「複雑なパイプ」と説明しておきます。

ファイルのパーミッションを一括変更したい

// ファイル: 664に変更
$ find . -type f | xargs -d "\n" chmod 664

// ディレクトリ: 775に変更
$ find . -type d | xargs --delimiter="\n" chmod 775

xargsfind系の検索コマンドとの組み合わせることで力を発揮します。 ここではfindコマンドとchmodコマンドを組み合わせて、ファイルのパーミッションを一括して変更しています。

// HTMLファイルに限定
$ find . -type f -name "*.html" -print0 | xargs -0 chmod 664

ファイルの種類を限定したい場合は-name "*.拡張子"のようにファイル名の一部を指定します。 ここでは-name "*.html"を指定子、HTMLファイルに限定しています。

ファイル名やディレクトリ名に空白文字や特殊文字が含まれている可能性があります。 xargsはデフォルトで空白文字で改行してしまうため、--delimiter="\n"で区切り文字を指定しています。

また、find -print0オプションでヌル文字(\0)を追加して、xargs-0 / --nullオプションで受け取ることで、より安全に処理できます。

一括削除したい

// 削除したいファイルを検索
$ fd "検索パターン"

// 実行結果に問題がなければxargsに渡す
$ fd -0 "検索パターン" | xargs -0 rm

ある種類のファイルを一括削除したい場合にもxargsが利用できます。 よく踏む手順として、まず fd "検索パターン" で対象ファイル群を確認し、 問題がなければ| xargs rmへのパイプを追記します。

rm "検索パターン"でも同じ結果が得られますが、 削除したいファイルの確認 -> 削除を実行 のようにフローを組めるのもxargsの便利なポイントだと思います。