sed를 사용하여 파일 이름에서 문자열을 이동하거나 이름을 바꿉니다.

sed를 사용하여 파일 이름에서 문자열을 이동하거나 이름을 바꿉니다.

이중 접미사 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" *

관련 정보