web-dev-qa-db-ja.com

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

Aで始まり2つの数字で終わるファイルを削除しようとしましたが、何も実行されません。
私が試したこと:

rm ^A*[0..9]2$

どこが間違っているのですか?

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

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は、パイプラインされるlineごとに1回rm lineを実行します。

どこが間違っているのですか?

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

また、正規表現が少しずれています。たとえば、*は正規表現での...の出現を意味するため、A*AAAなどに一致し、空の文字列も一致します。

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

61
Dennis

またはfindを使用:

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

このソリューションはweirdファイル名を扱います。

55
cYrus

Bash manページの filename Expansion セクションを参照してください。

rm A*[0-9][0-9]
11
glenn jackman

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

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

それが正しい場合は、次のように使用してください:

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

Unixで作業する場合、grepの使用方法を知ることが重要であるため、これは200倍優れています。使い方がわかればとてもパワフルです。

2
Salvatore

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

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

1
Ray

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

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

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

ファイルを削除する

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