フォルダ内のすべてのファイル名を変更する重複した文字列部分を削除する

フォルダ内のすべてのファイル名を変更する重複した文字列部分を削除する

同じですが、少し異なるサブフォルダーを 2 回含む多くのサブフォルダーがあるフォルダーがあります。

Movie1 {Action}{Adventure}{Sci-Fi}{Thriller}{Science Fiction}/
Movie2 {Action}{Adventure}{Thriller}{Science Fiction}/
Movie3 {Action}{Adventure}{Thriller}{Sci-Fi}}/
Movie4 {Action}{Adventure}{Thriller}/

すでに存在している「{Sci-Fi}」の「{Science Fiction}」部分を削除し、「{Sci-Fi}」は含まず、「{Science Fiction}」のみを含むfodlerの名前を変更して統合するにはどうすればいいですか? ?

私はforループを選択します:

for f in *; do
  if [ *"{Science Fiction}"* == "$f" ] && [ *"{Sci-Fi}"* == "$f" ]; then
    #delete the "{Science Fiction}" part
  else ...
  fi
done

しかし、これはあまりエレガントに見えません。よりクリーンなソリューションはありますか?

答え1

sedを使用して、文字列から重複する項目を削除できます。

for f in *; do
  r=$(echo $f | sed -r "s/(.*)(\{Sci-Fi\}|\{Science Fiction\})(.*)(\{Sci-Fi\}|\{Science Fiction\})(.*)/\1\2\3\5/g");
  echo $r;
done

出力が気に入ったら、にecho $f変更してください。mv "$f" "$r"

上の行は最初の一致する単語を取得し、2番目の単語を削除します。存在する場合でも常に優先順位をsed持つには、2つのステップで実行できます。Sci-FiScience FictionScience Fiction

for f in *; do
  r=$(echo $f | sed "s/{Science Fiction}/{Sci-Fi}/");
  s=$(echo $r | sed -r "s/(.*)(\{Sci-Fi\})(.*)(\{Sci-Fi\})(.*)/\1\2\3\5/g");
  if [ "$f" != "$s" ]; then
    echo "moving " $f " to " $s
  fi
done

関連情報