
Linux のシェルを利用しているとき、特定のファイル以外を削除するコマンドを備忘しました。
grep コマンドや find コマンド、xargs コマンドを組み合わせて実現しています。
find コマンドで、カレントディレクトリ配下のフルパスを一覧表示できます。
これと、grep や xargs コマンドを組合せることで、削除したいファイルやフォルダを絞ることができます。
フォルダ配下に以下のような大量のフォルダがあり、最新のフォルダ以外は削除したい場合のコマンドです。 (ハイライトしたフォルダが、削除したい対象です)
> ls
test.txt
aaa.txt
deploy_nodachisoftwww_20210809_170621
deploy_nodachisoftwww_20210810_003958
deploy_nodachisoftwww_20210810_073123
deploy_nodachisoftwww_20210811_113820
config
ここで、「deploy_nodachisoftwww_YYYYMMDD_HHMMSS」形式のフォルダについて、 最新のもの以外を削除したいとします。
コマンドは以下のようになります。
> find `pwd`/deploy_* -maxdepth 0 | sort | head -n -1 | xargs rm -rf
実行すると下のように対象のフォルダだけ削除されています。
> ls
test.txt
aaa.txt
deploy_nodachisoftwww_20210811_113820
config
複数のコマンドをパイプ(|)でつなげて実現しています。それぞれ実施している内容は下のようになっています。
find \
pwd`/deploy_ -maxdepth 0`)sort
)head -n -1
)xargs rm -rf
)YYYYMMDD をファイル名、フォルダ名に含むとき、2世代前まで残してあとは削除する場合は下のようなコマンドで対応できます。
> find `pwd`/deploy_* -maxdepth 0 | sort | head -n -2 | xargs rm -rf
head -n -2
とし、2世代ぶん(2行分)を対象から除いています。
たとえば、対象フォルダ配下に含まれる keshiteyo_1.txt、keshiteyo_2.txt、keshiteyo_3.txt などの、 「keshiteyo_*.txt」を削除したい時、以下で対応できます。
> find /対象フォルダのパス/ -type f -name keshiteyo_*.txt | xargs rm
rm コマンドでの削除は、ミスすると非常に危険で取り返しがつかないことがあるため、 実行するときはご自身で事前に確認して実行してください。 (もちろん筆者は責任とれませんので)
コメント、ありがとうございます。
ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。
Twitter:@NodachiSoft_jpお名前:以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください
お名前: