중복 가능성:
파일 확장자를 정리하려면 어떻게 해야 합니까?
확장자가 .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
--
$i
a로 시작 하더라도 -
옵션으로 해석되지 않도록 하세요 . 또 다른 접근 방식은 $i
로 시작하지 않도록 하는 것입니다 -
. 예를 들어 모든 상대 파일 이름 앞에 가 붙어 있는지 확인하십시오 ( 현재 디렉토리이므로 ./
지정된 파일에는 영향을 미치지 않습니다 )..
./*.flac.mp3의 경우 mv "$i" "${i%.flac.mp3}.mp3"을 수행합니다.
파일 이름을 자동으로 바꿀 수 있는 도구가 많이 있습니다.이름을 바꿔라여기에 몇 가지 아이디어가 있습니다. 예를 들어 쉘이 zsh인 경우:
autoload zmv # goes into your .zshrc
zmv '(*).flac.mp3' '$1.mp3'