1

ポートレートを撮るときは、その人物のイニシャルで名前を付けます。たとえば、ロバート ゴードンの最初の写真は (正規表現形式で) になりrg.(dng|tiff?|jpe?g|ps(d|b)|xcf)ます。次のものは、rg2...などです。

それらをフォルダーに分類する必要がある場合は、これを使用します。

mkdir <initials>/
mv <initials>*.* !$

しかし最近では、大量の写真を複数の被写体を含むフォルダーに分類する必要があったため、これを使用しました (例のイニシャルは df です:

for f in *.*; do
  if echo "$f" | grep -i *df*.*; then
    cp -n "$f" df/
    echo "$f"
  fi
done

だけど、いろいろな人とやり取りする画像がたくさんあって、それが終わったら名前を間違えて一致しないことを確認した上で手動で削除しなければならない.

拡張子の前のすべてを 2 文字のグループに分け、画像を一致するフォルダーにコピーし、完了したら削除する方法はありますか?

編集:与えられた例では正規表現は必要ないことを認識していますが、それらのいくつかでは、名前を付けるときに速くて不注意になり、エラーが発生したため、正規表現を使用して一度にすべてをキャッチする方が簡単でした.タイプミス。明らかに、その場合、正規表現はより大きくなりました。これは例です。名前は再び Daniel Fortner に編集され、唯一の主題でした。

for f in *.*; do
  if echo "$f" | grep -Eq '^df?([0-9]*)?(hr)?\..*$'; then
    mv "$f" df/
    echo "$f"
  fi
done
4

1 に答える 1

1

bash の[[regex マッチングとそれに続く の設定を利用し$BASH_REMATCHます。

#!/bin/bash
for file in *.*
do
  [[ $file =~ .*([[:alpha:]]{2})([[:digit:]]*)\.[^.]+ ]] || continue
  mkdir "${BASH_REMATCH[1]}" &> /dev/null
  mv -v "$file" "${BASH_REMATCH[1]}"
done
于 2013-08-07T04:33:40.900 に答える