正規表現でファイルを削除する


回答:


56

次のコマンドを使用して、条件に一致するすべてのファイルを削除できます。

ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm

使い方:

  1. ls すべてのファイルをリストします(結果がパイプされるため、1行ずつ)。

  2. grep -P "^A.*[0-9]{2}$" ファイルのリストをフィルタリングし、正規表現に一致するもののみを残します ^A.*[0-9]{2}$

    • .*出現の任意の数を示し..ワイルドカードマッチング任意の文字です。

    • [0-9]{2}は、の2つの出現[0-9]、つまり任意の数字を正確に示します。

  3. xargs -d"\n" rmパイプさrm lineれるたびに1回実行lineされます。

私はどこが間違っていますか?

まずrm、正規表現を引数として受け入れません。ワイルドカード*に加えて、他のすべての文字は文字通り処理されます。

また、正規表現は少しずれています。例えば、*任意の出現を意味する...正規表現で、そうA*試合AAA等とも空の文字列が。

詳細については、Regular-Expressions.infoにアクセスしてください


3
ファイル名のスペースに注意してください。
slhck

1
-d"\nスイッチは、スペースの問題を修正します。
FRG

1
注-一部のディストリビューション(Mac OSなど)にはgrep -P(Perl正規表現)がありません。grep -Eこの場合は動作する可能性があります。
bluescrubbie

1
私が使用して好む-Ixargs最初に常に非致死コマンドでテストをし、:xargs -d"\n" -I {} echo "{}"
jozxyqk

1
解析lsこの記事を指すこの質問を参照してください。落とし穴のために、あなたがrmしたくないものがあります。
カミルマシオロウスキ

45

または使用find

find your-directory/ -name 'A*[0-9][0-9]' -delete

このソリューションは、奇妙なファイル名に対処します。


4
これは素晴らしい解決策です。ファイルが大量に削除される前に正規表現が正しいかどうかを確認するために、最初に最後に-deleteフラグを省略することができるため、私はそれが好きです。
JAMESSTONEco

1
さらに、あなたは、たとえば追加するため、削除するものでより多くの制御を持っている-type f
マルコ・スッラ

これを使用してファイルやフォルダーを削除できますか?空でないフォルダでは機能しません。
アレックス

@Alex nope、ディレクトリは空でなければなりません(とにかくOPの要件ではありませんでした)、xargsアプローチを使用できますrm -f
cYrus


1

regexpを使用したソリューションは、コマンドを使用する前にどのファイルが削除されるかを確認でき、最終的なパイプを切断できる場合でも、200倍優れています。

ls | grep -P "^A.*[0-9]{2}$"

それが正しい場合は、次を使用してください:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d "\n" rm

Unixで作業する場合、grepの使用方法を知ることが重要であるため、これは200倍優れています。使い方を知っていれば非常に強力です。


1
これは、デニスの4年前の回答がすでに述べていることをはるかに上回っていないようです。
8ビットツリー

1
「200回」はかなり具体的です。他の多くのコマンドも非常に強力です。必要なのは、それらの使用方法を学ぶことだけです。
グレンジャックマン

1

これは私のMacで動作します:

rm $(ls | grep -e '^A*[0..9]2$')


0

find コマンドは正規表現でも動作します。

削除するファイルを確認します

find . -regex '^A.*[0-9]{2}$'

ファイルを削除する

find . -regex '^A.*[0-9]{2}$' -delete
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.