LinuxのBashで複数のファイルを一度に削除する方法は?


103

Linuxサーバー上のファイルのリストがあります。

abc.log.2012-03-14
abc.log.2012-03-27
abc.log.2012-03-28
abc.log.2012-03-29
abc.log.2012-03-30
abc.log.2012-04-02
abc.log.2012-04-04
abc.log.2012-04-05
abc.log.2012-04-09
abc.log.2012-04-10

rm -rf以下のコマンドを使用して、選択したログファイルを1つずつ削除しています。

rm -rf abc.log.2012-03-14
rm -rf abc.log.2012-03-27
rm -rf abc.log.2012-03-28

選択したファイルを一度に削除できるようにする別の方法はありますか?


4
そして、「Linuxだけでなく、GNU / Linuxと言って」、後部座席から雷が鳴っているのが聞こえます。
Boris Stitnicky、2012年

8
ところで、なぜ-rfなのですか?これらのフォルダはありますか?fは強制、rは再帰的です。ファイルのみの場合でも機能しますが、何かを削除するたびに-rfを使用すると、非常に(非常に)(非常に)危険です。(「linux」の幅が広すぎるため、タグ「bash」を追加する必要があります
。– Depado

@BorisStitnicky-なぜこれGNUが必要なのか知りたいのですが?
user66001 2013

2
@ user66001:問題に関するGNUプロジェクトの意見の場合:gnu.org/gnu/linux-and-gnu.html。私はその問題については何の立場も取りません。少なくともここではそうではありません。そして、これはそれを議論する場所ではありません
キーストンプソン

2
@BorisStitnicky-議論する必要はなく、完全に無知であり、そのリンクは私が探していた情報レベル+1を与えました
user66001

回答:


159

Bashは、あらゆる種類のワイルドカードと拡張をサポートしています。

あなたの正確なケースは次のようにブレース展開によって処理されます:

$ rm -rf abc.log.2012-03-{14,27,28}

上記は、3つの引数すべて含む単一のコマンドに展開され、次のように入力することと同じです。

$ rm -rf abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28

rmがロードされる前に、この展開はシェルによって行われることに注意することが重要です。


今後ファイルを復元する場合は、「rm」を使用しないでください。「rm-trash」ユーティリティを使用できます: github.com/nateshmbhat/rm-trash
Natesh bhat

75

ワイルドカード(*)を使用して、複数のファイルを照合します。

たとえば、次のコマンドは、名前がで始まるすべてのファイルを削除しますabc.log.2012-03-

rm -f abc.log.2012-03-*

コマンドをls abc.log.2012-03-*実行する前に削除対象を確認できるように、ファイルをリストして実行することをお勧めしますrm

詳細については、ファイル名の拡張に関するBashのmanページを参照してください。


非常に便利ですが、削除の確認を求めていません。ご留意ください。
nuriselcuk

1
@nuriselcukでは、削除される各ファイルの確認を取得するために-iを追加できます。
フェリペロメロ

Amazon Linux 1を実行しているAWS Ec2-Instanceの魅力のように動作しました:)ありがとうございます。
カイルブリデンスティン

41

名前が特定の形式に一致するすべてのファイルを削除する場合は、ワイルドカード(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 barrm -f 'foo bar'ます。


8

崇高な複数行選択を使用して、すべてのファイルを1行に結合し、各ファイル名の間にスペースを追加rmしてから、リストの先頭に追加します。これは主に、削除するファイル名にパターンがない場合に役立ちます。

[$]> rm abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28 abc.log.2012-03-29 abc.log.2012-03-30 abc.log.2012-04-02 abc.log.2012-04-04 abc.log.2012-04-05 abc.log.2012-04-09 abc.log.2012-04-10

これは、提起された質問に明示的に回答するため、受け入れられる回答でなければなりません。Googleから来た人にとっては、よりフレンドリーです。
ATLief 2016年

5

ワイルドカードはこれでうまく機能しますが、安全のためには、ワイルドカードの使用をできるだけ最小限にするのが最善です。

rm -rf abc.log.2012-*

見た目からは、これらは単一のファイルですか?これらの項目のいずれもディレクトリでない場合、再帰的なオプションは必要ありません。安全のために、それを使用しないことをお勧めします。


2

私はLinuxの第一人者ではありませんが、出力ファイルのリストをにパイプしたいと思いますxargs rm -rf。私は過去にこのようなものを使用して、良い結果を得ました。まずサンプルディレクトリでテストしてください!

編集-表示されている他の回答に基づいて、誤解している可能性があります。ワイルドカードを使用できる場合は、すばらしいです。あなたが表示したあなたの元のリストはあなたにあなたの「選択」を与えるためのプログラムによって生成されたと思ったので、私はパイプでxargs行くことが道だと思いました。


-1

ディレクトリに属する​​すべてのファイルを一度に削除する場合。例:ディレクトリ名は「log」で、「log」ディレクトリにはabc.log.2012-03-14、abc.log.2012-03-15などのファイルが含まれます。ログディレクトリの上にいる必要があります。

rm -rf /log/*
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.