何千ものファイルを含むディレクトリがあります。これらの多くは、ファイル名が画像解像度で始まる画像です。画像の高さと幅は、2桁、3桁、4桁、または5桁です。たとえば、
- 986x1088_lalbslj.jpg
- 2043x924_fjnndkk.jpg
- 9560x12643_fjknfd.jpg
- 24x24_dnjkan.jpg
これらすべての画像を新しいディレクトリ(たとえば./images/
)に収集したいと思います。簡単に聞こえますね。
単純な正規表現は[0-9]+x[0-9]+.*
これらのファイル名と一致しますが、私が知っている限り、正規表現を組み合わせることはできませんmv
。
理想的には、次のことがうまくいきたいのですが、もちろんmv [0-9]+x[0-9]+.* images
そうではありません。
この質問は以前に何度も要求されたようです。この質問と他のStackExchangeの同様のスレッドを数十(文字通り!)見てみましたが、残念ながらまだ役に立つ答えを見ていませんでした。ほとんどの場合、許可された答えは単にmv
正規表現の代わりにglobを使用する方法を説明したり、作成者を助けるためにそのglobを提案しますが、私の場合はうまくいきませんでした.だから私は私の運を試してみたかったと私自身に質問を投げたかった。よろしくお願いします。
私のパターンを合理的なグローブに圧縮することはできず、正規表現が機能しないようです。mv
それではどうすればいいですか?
当然、このようなことは可能ではないでしょうか?
情熱的な答えは本当にありがとう!
答え1
あなたはそれを使用することができます拡張グローバル:
extglob
組み込みオプションを使用してシェルオプションを有効にすると、複数の拡張パターン一致演算shopt
子が認識されます。以下の説明では、パターンリスト""で区切られた1つ以上のパターンのリスト|
。複合パターンは、次のサブパターンのうちの1つ以上を使用して形成できます。[...]
+(pattern-list)
与えられたパターンと1つ以上一致します。
だから:
shopt -s extglob
mv +([0-9])x+([0-9])* ./images
答え2
次のループを使用して目標を達成できます。
for i in *
do
echo "$i" | grep -qE "^[[:digit:]]+x[[:digit:]]+.*" && mv "$i" images
done
次のように正規表現を変更して、2〜5桁の数字を指定できます。
for i in *
do
echo "$i" | grep -qE "^[[:digit:]]{2,5}x[[:digit:]]{2,5}.*" && mv "$i" images
done
答え3
mv $(ls | grep YOUR_REGEX) ターゲットディレクトリ/
問題を解決しなければならない
乾杯