이름이 바뀐 여러 파일 [중복]

이름이 바뀐 여러 파일 [중복]

중복 가능성:
파일 확장자를 정리하려면 어떻게 해야 합니까?

확장자가 .flac.mp3인 파일의 이름을 .mp3 확장자로 바꾸고 싶습니다. 다음 명령을 사용했습니다.

$ for i in *; do mv $i `echo $i | sed 's/.flac//g'`; done

그러면 각 파일에 대해 다음과 같은 오류 메시지가 기록됩니다.

mv: target `file.mp3' is not a directory

내가 뭘 잘못했나요?

감사해요

답변1

어쩌면 이 파일의 이름에 공백이 포함되어 있을 수도 있습니다.

쉘 프로그래밍을 위한 간단한 규칙:변수 및 명령 대체에는 항상 큰따옴표를 사용하십시오.(제외해야 하는 이유를 아는 경우는 제외) 그래서:

for i in *; do mv "$i" "$(echo "$i" | sed 's/.flac//g')"; done

이렇게 하면 문제의 원인이 아니더라도 해당 명령을 더 잘 수행할 수 있습니다. 현재 디렉터리의 모든 파일이 아닌 영향을 받아야 하는 파일에 대해서만 명령을 실행해야 합니다. sed 정규식은 .flac확장 이외의 항목과도 ​​일치할 수 있습니다. 파일 이름이 -또는 로 시작하고 백슬래시를 포함하는 경우에도 echo명령이 실패할 수 있습니다 (일부 버전에서는 그렇지 않음).

for i in *.flac.mp3; do mv -- "$i" "$(echo "$i" | sed 's/\.flac\.mp3$/\.mp3/')"; done

그러나 실제로 여기서는 sed를 사용할 필요가 없습니다. 문자열에서 접미사를 제거하는 쉘 구조가 있습니다.

for i in *.flac.mp3; do mv -- "$i" "${i%.flac.mp3}.mp3"; done

--$ia로 시작 하더라도 -옵션으로 해석되지 않도록 하세요 . 또 다른 접근 방식은 $i로 시작하지 않도록 하는 것입니다 -. 예를 들어 모든 상대 파일 이름 앞에 가 붙어 있는지 확인하십시오 ( 현재 디렉토리이므로 ./지정된 파일에는 영향을 미치지 않습니다 )..

    ./*.flac.mp3의 경우 mv "$i" "${i%.flac.mp3}.mp3"을 수행합니다.

파일 이름을 자동으로 바꿀 수 있는 도구가 많이 있습니다.여기에 몇 가지 아이디어가 있습니다. 예를 들어 쉘이 zsh인 경우:

autoload zmv    # goes into your .zshrc
zmv '(*).flac.mp3' '$1.mp3'

관련 정보