複雑なパイプしたい(xargs
)
$ コマンド | xargs コマンド
xargs
コマンドで、あるコマンドの実行結果を引数にして、つぎのコマンドに渡すことだできます。
パイプとはちょっと違うと思いますが、「複雑なパイプ」と説明しておきます。
ファイルのパーミッションを一括変更したい
// ファイル: 664に変更
$ find . -type f | xargs -d "\n" chmod 664
// ディレクトリ: 775に変更
$ find . -type d | xargs --delimiter="\n" chmod 775
xargs
はfind
系の検索コマンドとの組み合わせることで力を発揮します。
ここでは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
の便利なポイントだと思います。