디렉토리에 있는 여러 음악 트랙의 이름을 바꾸려고 하는데 다음 오류가 발생합니다.
여러 파일을 이동할 때 마지막 매개변수는 디렉터리여야 합니다.
스크립트는 다음과 같습니다.
for file in * ; do
mv $file $(echo $file |sed 's/^.\{5\}//g')
done
이는 공백이 없는 파일에 적용됩니다. 이 스크립트를 어떻게 수정합니까?
답변1
따옴표 사용:
mv -- "$file" "$(echo "$file" | sed ...)"
그렇지 않으면 mv
여러 매개변수가 표시됩니다. 이름이 지정된 파일 이름은 file name with spaces
4개의 매개변수입니다 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
.