동일하지만 약간 다른 하위 폴더가 두 번 포함된 많은 하위 폴더가 있는 폴더가 있습니다.
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"
위의 줄은 첫 번째 일치하는 단어를 가져오고 두 번째 단어를 삭제합니다. 존재 하는 경우에도 항상 우선순위 를 sed
가지려면 두 단계로 수행할 수 있습니다.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