ワンライナーのコマンドを使うときってxargsとかfindとか多く使用するかと思います。忘れがちなので、整理してみたいと思います。
xargs のユースケース
私が一番よく使うのは、パイプで渡されたファイルやディレクトリを削除するという使い道です。一気に何かをしたいときには、find コマンドと併用したりして、使います
xargs を使って削除していこう
# 削除するディレクトリ一覧
find /var/tmp/nginx/ -type d
/var/tmp/nginx/
/var/tmp/nginx/test
/var/tmp/nginx/test/log
/var/tmp/nginx/test/ttt
/var/tmp/nginx/umask-test
/var/tmp/nginx/permit-dir
/var/tmp/nginx/permit-dir2
/var/tmp/nginx/permit-dir2/permit-2
/var/tmp/nginx/permit-dir2/permit-2/permit-3
現状、一覧がこれらです。
実際に消してみます。
find /var/tmp/nginx/ -type d | xargs rm -rf
と削除コマンドをいきなり打ってもいいんですが、ちょっと対象が間違っていたらどうしようとおもうこともあると思います。そんなあなたに朗報です。xargs にはドライランの機能があります。
xargs の後ろに-p オプションをつけてみてください。
find /var/tmp/nginx/ -type d | xargs -p rm -rf
# 削除対象になるディレクトリ一覧
rm -rf /var/tmp/nginx/ /var/tmp/nginx/test /var/tmp/nginx/test/log /var/tmp/nginx/test/ttt /var/tmp/nginx/umask-test /var/tmp/nginx/permit-dir /var/tmp/nginx/permit-dir2 /var/tmp/nginx/permit-dir2/permit-2 /var/tmp/nginx/permit-dir2/permit-2/permit-3 ?...
これで削除対象が合っているかの確認ができます。対象が多くなると確認しづらいというデメリットがあるとは思いますが。ドライランオプションで確認が取れたら、実際にコマンドを実行してみましょう
find /var/tmp/nginx/ -type d | xargs rm -rf
削除されたことを確認してみて、削除されていたら成功です。
他にも使い方(find との組み合わせ方)
ファイルを削除する場合
find /var/tmp/nginx/ -type f | xargs rm -rf
一日分のみ(今日が4/1 14:00とするとそこから一日前まで取得する)
timestamp を見るので、ファイルの日付とかと違うことが大いにあり得るので、注意してください
find /var/tmp/nginx/ -type f -mtime -1
xargs を使わないで引数だけ渡す方法とか
xargs って結構未知の部分が多い、コマンドになります。(少なくとも僕にとっては)ですので、いくら上手くやってもxargs 以下のコマンドに引数が上手く渡らないなっていう時があると思います。
そんな時に使えるのが、-exec オプションです。
find /var/tmp/nginx/ -type f -exec chmod 600 {} \;
みたいな感じです。やっていることは、find コマンドで取得したファイルを chmod の後の {} に渡している形になります。-exec でそのコマンドを実行する意味です
find /var/tmp/nginx/ -type f
まとめ
xargs とか -exec とかってなかなか使ってみないと挙動がわからなかったりすることも少なくないのかなと思います。find も file だけとかdirectory だけとか、permission とかも絞ったりして取得できるので、結構便利です。xargs find などを使って効率よくしていきましょ~~~