iPod에서 노래를 추출했는데, 그렇게 하면 각 노래의 이름이 "-[노래의 원래 이름]"으로 변경되었습니다. 첫 번째 "-"를 제거하는 bash 스크립트를 작성하고 싶습니다. 왜냐하면 거기에 아마도 1000곡이 있고 수동으로 이름을 바꿀 수 없기 때문입니다. 이 작업을 수행하기 위해 mv 및 rename을 사용하려고 시도했지만 특수 문자로 인해 작동하지 않았습니다. 인터넷에서 찾아본 결과 "-"를 ""로 바꾸는 솔루션을 찾았지만 문제는 첫 번째 "-"만 제거하고 다른 잠재적인 "-"는 제거하고 싶지 않다는 것입니다. 내 노래 "이름. 충분히 명확하게 설명했으면 좋겠습니다. 누구든지 저를 도와주실 수 있나요?
이것은 내 원본 스크립트입니다.
#!/bin/bash
for f in *; do
echo "${f}";
if [[ ${f:0:1} == "-" ]]; then
echo "renaming ${f}";
rename.ul ${f} ${f:1} *.mp3;
fi
done
답변1
for f in -*.mp3; do
echo mv -- "$f" "${f:1}"
done
원하는 대로 작동한다고 확신하면 제거하세요 echo
.
--
파일 이름에 옵션으로 mv
해석되는 것을 방지하려면 이중 대시( )가 필요합니다 -
. 파일 이름에 공백이 포함된 경우 변수를 따옴표로 묶어야 합니다.
답변2
대시로 시작하는 명령에 인수를 전달하고 해당 인수가 옵션으로 해석되는 것을 원하지 않는 경우 --
먼저 (이중 대시)를 인수로 전달하십시오. 거의 모든 명령에 대해 --
"이제부터 더 이상 옵션이 없습니다"를 의미합니다.
rename.ul -- '-' '' -*
또 다른 가능성은 대시로 시작하지 않도록 매개변수를 정렬하는 것입니다. 항상 가능한 것은 아니지만 파일 이름의 경우 prepend 입니다 ./
.
rename.ul ./- ./ ./-*
루프가 필요하지 않다는 점에 유의하세요. rename
파일 목록을 매개변수로 사용하여 만족하세요. 또한 전체 파일 이름을 전달할 필요가 없으며 이름을 바꾸려는 부분만 전달하면 됩니다. (사실 스크립트의 문제점 중 하나는 전체 파일 이름을 교체용 문자열로 전달한 다음 매번 모든 파일 목록을 전달하여 내용을 뒤섞는 것입니다.)
반품변수 대체에는 항상 큰따옴표를 사용하세요.그렇지 않으면 스크립트가 공백이 포함된 파일 이름을 처리할 수 없습니다.