공백을 사용하여 여러 파일에서 특정 문자 제거

공백을 사용하여 여러 파일에서 특정 문자 제거

디렉토리에 있는 여러 음악 트랙의 이름을 바꾸려고 하는데 다음 오류가 발생합니다.

여러 파일을 이동할 때 마지막 매개변수는 디렉터리여야 합니다.

스크립트는 다음과 같습니다.

for file in * ; do
    mv $file  $(echo $file |sed 's/^.\{5\}//g')
done

이는 공백이 없는 파일에 적용됩니다. 이 스크립트를 어떻게 수정합니까?

답변1

따옴표 사용:

mv -- "$file" "$(echo "$file" | sed ...)"

그렇지 않으면 mv여러 매개변수가 표시됩니다. 이름이 지정된 파일 이름은 file name with spaces4개의 매개변수입니다 mv. 따라서 오류는 다음과 같습니다: when moving multiple files, last argument must be a directory. mv매개변수가 2개 이상인 경우 여러 파일을 디렉터리로 이동하려고 한다고 가정해 보겠습니다(이것이 마지막 매개변수가 됩니다).


그런데 파일 이름에서 처음 5자를 제거하려는 것 같습니다. 이는 다음과 같이 더 간단하게 수행할 수 있습니다 bash.

mv -- "$file" "${file:5}"

편집하다:로고를 추가했습니다 --. @댓글 감사합니다.파북. 이제 대시로 시작하는 파일 -도 올바르게 처리됩니다.

답변2

일반적으로 Perl과 함께 배포되는 prename을 사용할 수 있습니다. (예를 들어 Debian에서는 /usr/bin/prename이 패키지에 의해 설치됩니다 perl.) 배포판이 패키지되어 있지 않은 경우(일반 바이너리 위치를 찾아서 prename) rename다음과 같은 여러 위치에서 다운로드할 수 있습니다.여기,여기또는여기.

스크립트는 정규식을 가져와 이를 각 파일 이름과 파일 이름 집합에 적용하고 해당 정규식을 기반으로 해당 파일의 이름을 수정합니다.

예를 들어 다음과 같이 할 수 있습니다.

prename -v -n 's/^.{5}//' *

파일 이름의 처음 5자를 제거하면 어떤 일이 발생하는지 보여줍니다. 실제로 이름 바꾸기를 수행하려면 -n.

관련 정보