Aで始まり2つの数字で終わるファイルを削除しようとしましたが、何も実行されません。
私が試したこと:
rm ^A*[0..9]2$
どこが間違っているのですか?
次のコマンドを使用して、条件に一致するすべてのファイルを削除できます。
ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm
使い方:
ls
は、すべてのファイルをリストします(結果はパイプ処理されるため、1行ずつ表示されます)。
grep -P "^A.*[0-9]{2}$"
はファイルのリストをフィルタリングし、正規表現に一致するファイルのみを残します^A.*[0-9]{2}$
.*
は、任意の数の.
の出現を示します。ここで、.
は、任意の文字に一致するワイルドカードです。
[0-9]{2}
は、2つの[0-9]
の出現、つまり任意の数字を示します。
xargs -d"\n" rm
は、パイプラインされるline
ごとに1回rm line
を実行します。
どこが間違っているのですか?
まず、rm
は引数として正規表現を受け入れません。ワイルドカード*
に加えて、その他すべての文字は文字どおりに扱われます。
また、正規表現が少しずれています。たとえば、*
は正規表現での...
の出現を意味するため、A*
はA
、AA
などに一致し、空の文字列も一致します。
詳細については、 Regular-Expressions.info にアクセスしてください。
またはfind
を使用:
find your-directory/ -name 'A*[0-9][0-9]' -delete
このソリューションはweirdファイル名を扱います。
Bash manページの filename Expansion セクションを参照してください。
rm A*[0-9][0-9]
Regexpを使用したソリューションは200倍優れていますが、コマンドを使用する前に削除されるファイルを確認して、最後のパイプを切断することもできます。
ls | grep -P "^A.*[0-9]{2}$"
それが正しい場合は、次のように使用してください:
ls | grep -P "^A.*[0-9]{2}$" | xargs -d "\n" rm
Unixで作業する場合、grepの使用方法を知ることが重要であるため、これは200倍優れています。使い方がわかればとてもパワフルです。
これは私のMacで動作します:
rm $(ls | grep -e '^A*[0..9]2$')
find
コマンドは正規表現でも動作します。
削除するファイルを確認する
find . -regex '^A.*[0-9]{2}$'
ファイルを削除する
find . -regex '^A.*[0-9]{2}$' -delete