名前が特定の形式に一致するすべてのファイルを削除する場合は、ワイルドカード (グロブ パターン) が最も簡単な解決策です。いくつかの例:
$ rm -f abc.log.* # Remove them all
$ rm -f abc.log.2012* # Remove all logs from 2012
$ rm -f abc.log.2012-0[123]* # Remove all files from the first quarter of 2012
正規表現はワイルドカードより強力です。grep
の出力をto にフィードできますrm -f
。たとえば、ファイル名の一部が で始まり、"abc.log"
一部が で"ABC.log"
始まるgrep
場合、大文字と小文字を区別しない一致を実行できます。
$ rm -f $(ls | grep -i '^abc\.log\.')
ファイル名のいずれかにスペースを含む変な文字が含まれている場合、これは問題を引き起こします。気をつけて。
これを行うとき、ls | grep ...
最初にコマンドを実行し、必要な出力が生成されることを確認します-特に使用している場合rm -f
:
$ ls | grep -i '^abc\.log\.'
(check that the list is correct)
$ rm -f $(!!)
where!!
は前のコマンドに展開されます。または、上向き矢印または Ctrl-P を入力し、前の行を編集してrm -f
コマンドを追加することもできます。
これは、bash シェルを使用していることを前提としています。他の一部のシェル、特に csh と tcsh および一部の古い sh 派生シェルでは、$(...)
構文がサポートされていない場合があります。同等のバックティック構文を使用できます。
$ rm -f `ls | grep -i '^abc\.log\.'`
構文は読みやすく、$(...)
本当に野心的な場合は入れ子にすることができます。
最後に、削除したいファイルのサブセットを正規表現で簡単に表現できない場合、私がよく使用するトリックは、ファイルを一時テキスト ファイルにリストしてから編集することです。
$ ls > list
$ vi list # Use your favorite text editor
次に、ファイルを手動で編集し、list
削除したいファイルのみを残して、次のようにします。
$ rm -f $(<list)
また
$ rm -f `cat list`
(繰り返しますが、これはファイル名に変な文字、特にスペースが含まれていないことを前提としています。)
または、list
ファイルを編集するときに、rm -f
各行の先頭に追加してから、次のことを行うことができます。
$ . ./list
また
$ source ./list
ファイルの編集は、必要に応じて引用符を追加する機会でもあります。たとえばrm -f foo bar
、rm -f 'foo bar'
.