名前が特定の形式に一致するすべてのファイルを削除する場合は、ワイルドカード(globパターン)が最も簡単な解決策です。いくつかの例:
$ 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
にフィードできます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 $(!!)
ここで!!
、前のコマンドに展開されます。または、上矢印または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'
ます。