「-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-awk
、posix-basic
とですposix-egrep
。posix-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