同じですが、少し異なるサブフォルダーを 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-Fi
Science Fiction
Science 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