指定されたパターンで終わるファイルを繰り返し検索します。

指定されたパターンで終わるファイルを繰り返し検索します。

「-105x135.jpg」、「-410x410.jpg」など、「780-105x135.jpg」、「candyswing-2-klein-ohrringe-schale-038-135x160.jpg」で終わるファイルを含むフォルダがたくさんあります。たとえば、オンライン正規表現を使用して次のパターンを作成して検索して削除する必要があります[0-9]x..[0-9].jpgが、find . -regex '[0-9]x..[0-9].jpg' 結果は表示されません。

答え1

ページによると、manこの-regexオプションは次のとおりです。フルパス、すなわち。これみんなファイル名そして完全なディレクトリパス部分もあるため、正規表現の前に追加する必要があります.*。そのページにはいくつかの明確な例がありますman

また、このオプションを念頭に置いてください-regextype。デフォルト値(ページあたり)manはですが、emacs他のオプションはposix-awkposix-basicとですposix-egrepposix-extended自分を気絶させてください。

答え2

別のオプションはbashのglobstarオプションを使用することです:

shopt -s globstar

リスト:

ls **/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg

または削除:

rm **/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg

文書。

上記のglobパターンは、与えられた正規表現とは少し異なります。どの最後の2文字はx厳密に言えば数字ではありません。つまり、名前:ファイルはsomefile-135xyz9.jpg正規表現と一致しますが、上記のglobとは一致しません。

globは再帰的に(**)次のファイルと一致します。

  • 何でも始めましょう(*
  • 3つの数字があります(3つ[0-9]
  • それからx
  • その後の数字3
  • 続いて.jpg

このアプローチの1つのリスクは、一致するファイル数がコマンドラインパラメータスペースを超える場合です。この場合、ファイル名を配列に保存し、配列を個別に繰り返すことができます。

確認するには:

files=(**/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg)
for file in "${files[@]}"; do echo Would: rm -- "$file"; done

削除する:

files=(**/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg)
for file in "${files[@]}"; do rm -- "$file"; done

関連情報