web-dev-qa-db-ja.com

で始まるが含まれていないファイルを削除する

一度に多くのファイルを削除しようとしていますが、実際に必要なファイルを削除しないように具体的に指定する必要があります。

master-で始まる破損したファイルがたくさんありますが、master-2018で始まる有効なファイルがあります

だから、私は次のようなことをしたいです

rm -rf master-* --exclude master-2018*

それは可能ですか?

6

はい、findで複数のパターンを使用できます:

$ find -name 'master-*' \! -name 'master-2018*' -print0 -Prune |
     xargs -0 echo rm -fr

(ドライランに満足したら、echoを削除してください)

-maxdepth 1述語をfindの直後に追加する必要があるのは、roが現在のディレクトリからファイルを削除するだけの場合、つまりmaster-1991は削除し、subdir/master-1991は削除しない場合です。

18
mosvy

バッシュで:

shopt -s extglob
echo rm master-!(2018*)

正しく見える場合は、echoを削除します。

上記は、bashの拡張グロビング機能を使用して、master-で始まり、直後に2018がなく、その後に何でも続くファイル(*)を照合します。

11
Jeff Schaller

削除するすべてのファイルにmaster-YYYY *のようなパターンがある場合、それらのパターンを使用できます。

rm -rf master-???[0-79]*
rm -rf master-??[02-9]*
rm -rf master-?[1-9]*
rm -rf master-[013-9]*

目標は、年の数字を省略することです。つまり、マスターの後に最初に、2桁目を省略(削除しないでください)する必要があります。2桁目は0、3桁目は1、4桁目は8です。少し前に試してみましたが、最初の2つだけを実行するのに十分です。

2番目の方法:master-2018を別のディレクトリに移動できます。/tmp、master- *ですべてを削除し、tmpからmaster-2018に戻します。

mkdir /tmp/backup
mv -r master-2018* /tmp/backup
rm -rf master-*
mv -r /tmp/backup/* .
0