117

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

7 に答える 7

173

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ロードされる前にシェルによって行われることに注意することが重要です。

于 2012-05-09T12:46:57.710 に答える
84

*複数のファイルに一致させるには、ワイルドカード ( ) を使用します。

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

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

ls abc.log.2012-03-*コマンドを実行する前に、何を削除するかを確認できるように、実行してファイルを一覧表示することをお勧めしますrm

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

于 2012-05-09T12:46:30.197 に答える
45

名前が特定の形式に一致するすべてのファイルを削除する場合は、ワイルドカード (グロブ パターン) が最も簡単な解決策です。いくつかの例:

$ 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 barrm -f 'foo bar'.

于 2013-09-04T15:56:16.743 に答える
9

Just use multiline selection in sublime to combine all of the files into a single line and add a space between each file name and then add rm at the beginning of the list. This is mostly useful when there isn't a pattern in the filenames you want to delete.

[$]> 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
于 2016-07-01T00:26:57.103 に答える
5

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

rm -rf abc.log.2012-*

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

于 2012-05-09T19:09:28.917 に答える
3

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

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

于 2012-05-09T12:49:05.347 に答える
-1

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

rm -rf /log/*
于 2015-08-18T11:44:23.537 に答える