이중 접미사 avi.avi가 있는 폴더에 여러 개의 비디오 파일이 있습니다.
find /home/alex/Filme/ -type f -name '*.avi.avi'
/home/alex/Filme/Super 8.avi.avi
/home/alex/Filme/Exit - A Night From Hell.avi.avi
/home/alex/Filme/Der Plan.avi.avi
/home/alex/Filme/Ich.bin.Nummer.4.2011.avi.avi
snipp
다음 "스크립트"를 사용하여 이중 문자열을 제거하려고 합니다.
#!/bin/bash
for i in `find $HOME/Filme -type f -name '*avi.avi' -print0`
do
sed -e 's/'*.avi.avi'/'*.avi'/g'
done
아니면 이와 같이 이름 바꾸기를 통해 이를 달성하는 더 좋은 방법이 있습니까?
find $HOME/Filme -type f -name '*avi.avi' -print0 -exec sh -c rename -v 's/*.avi.avi/*.avi/g' {} \;
폴더 이름이 유지되는지 잘 모르겠습니다. 예, 이에 대한 몇 가지 질문과 답변을 찾았지만 이를 제 상황에 적용하는 데 어려움을 겪고 있습니다.
내 방법 중 하나가 효과가 있을까요?
답변1
거의 다 왔습니다.
find $HOME/Filme -type f -name '*avi.avi' -exec \
sh -c "rename -v 's/\.avi\.avi$/.avi/'" {} \;
(인수는 rename
정규식 대체입니다. /g
이 옵션은 일치하는 파일 이름에 있는 모든 항목을 바꾸려는 경우에만 유용합니다. 그러나 정의에 따르면 끝에 일치하는 항목은 하나만 있을 수 있습니다.)
아마도 더 유용하게는 이 작업을 일괄 처리할 수 있으며 이식성을 향상시키는 데 사용될 수도 있습니다 mv
.
find $HOME/Filme -type f -name '*avi.avi' -exec \
sh -c 'for f; do mv -v "$f" "${f%.avi}"; done' _ {} +
하위 디렉터리를 탐색할 필요가 없는 경우
for f in $HOME/Filme/*.avi.avi; do
mv -v "$f" "${f%.avi}"
done
답변2
간단하게 사용하세요이름을 바꿔라(진주구현) 명령:
rename 's/(.*\.avi)\.avi$/$1/' /home/alex/Filme/*.avi.avi
아니면 마지막 .avi
부분만 제거하세요.
rename 's/\.avi$//' /home/alex/Filme/*.avi.avi
답변3
이 코드를 사용하여 이러한 파일의 이름을 바꿉니다.
rename -v "s/\.avi$//g" *