첫 번째와 두 번째 호출은 비교를 위한 것입니다. 출근을 시도하는 것은 이번이 세 번째입니다.
$ ls -a1 *mp3
DaftPunk_VeridisQuo.mp3
French79_AfterParty.mp3
French79_BetweentheButtons.mp3
French79_Hometown.mp3
$ find . -maxdepth 1 -type f -name '*mp3'
./French79_AfterParty.mp3
./French79_Hometown.mp3
./DaftPunk_VeridisQuo.mp3
./French79_BetweentheButtons.mp3
$ for x in "$(ls -a *mp3)"; do mv "./$x" "./electro_$x"; done
mv: cannot stat './DaftPunk_VeridisQuo.mp3'$'\n''French79_AfterParty.mp3'$'\n''French79_BetweentheButtons.mp3'$'\n''French79_Hometown.mp3': No such file or directory
답변1
나는 직접 사용하는 것을 선호합니다.
for x in *.mp3
do
mv ./"$x" "electro_$x"
done
답변2
참고로 $(..)
N 토큰 대신 하나의 토큰을 얻습니다.
몇 가지 예제 파일로 시작했습니다.
$ ls
a.mp3 b.mp3 c.mp3
귀하의 접근 방식을 따르면 다음 세 줄 중 하나가 표시됩니다.
for i in "$(ls *.mp3)"; do
echo "--> $i"
done
--> a.mp3 b.mp3 c.mp3
주변 따옴표를 생략하면 $(...)
세 가지 다른 출력 줄이 표시됩니다.
for i in $(ls *.mp3); do
echo "--> $i"
done
--> a.mp3
--> b.mp3
--> c.mp3
파일에 공백이 있으면 다음과 같이 문제를 해결할 수 있습니다. (이 방법은 현재 디렉터리의 파일에만 적용됩니다.)
앞으로
$ ls
'DaftPunk VeridisQuo.mp3' 'French79 AfterParty.mp3' 'French79 BetweentheButtons.mp3' 'French79 Hometown.mp3'
이름 바꾸기 find
:
$ find *.mp3 -maxdepth 1 -type f -name *.mp3 -exec mv {} "electro_{}" \;
$ ls
'electro_DaftPunk VeridisQuo.mp3' 'electro_French79 AfterParty.mp3' 'electro_French79 BetweentheButtons.mp3' 'electro_French79 Hometown.mp3'
find *.mp3
단순히 제안하는 대신 제안하는 이유는 무엇입니까 find . -type f -name '*.mp3' ...
?
$ find . -maxdepth 1 -type f -name '*.mp3' -exec mv {} "electro_{}" \;
mv: cannot move './French79 Hometown.mp3' to 'electro_./French79 Hometown.mp3': No such file or directory
mv: cannot move './French79 BetweentheButtons.mp3' to 'electro_./French79 BetweentheButtons.mp3': No such file or directory
mv: cannot move './French79 AfterParty.mp3' to 'electro_./French79 AfterParty.mp3': No such file or directory
mv: cannot move './DaftPunk VeridisQuo.mp3' to 'electro_./DaftPunk VeridisQuo.mp3': No such file or directory
답변3
당신이 원하는 것은 Perl rename
유틸리티(일명 prename
. file-rename
이것은아니요rename
패키지와 동일한 유틸리티 util-linux
(완전히 다르고 호환되지 않는 명령줄 옵션 및 기능 포함)
노력하다
rename -n 's/^/electro_/' *.mp3
이 -n
옵션을 사용하면 시범적으로 실행되며전시하다허용한 경우 .mp3 파일의 이름을 어떻게 바꾸시겠습니까? 실제로 이름을 바꾸려면 제거 하거나 자세한 출력으로 -n
바꾸십시오 .-v
$ touch DaftPunk_VeridisQuo.mp3 French79_AfterParty.mp3 French79_BetweentheButtons.mp3
$ ls -l
total 2
-rw-r--r-- 1 cas cas 0 Oct 21 14:30 DaftPunk_VeridisQuo.mp3
-rw-r--r-- 1 cas cas 0 Oct 21 14:30 French79_AfterParty.mp3
-rw-r--r-- 1 cas cas 0 Oct 21 14:30 French79_BetweentheButtons.mp3
$ rename -v 's/^/electro_/' *.mp3
DaftPunk_VeridisQuo.mp3 renamed as electro_DaftPunk_VeridisQuo.mp3
French79_AfterParty.mp3 renamed as electro_French79_AfterParty.mp3
French79_BetweentheButtons.mp3 renamed as electro_French79_BetweentheButtons.mp3
$ ls -l
total 2
-rw-r--r-- 1 cas cas 0 Oct 21 14:30 electro_DaftPunk_VeridisQuo.mp3
-rw-r--r-- 1 cas cas 0 Oct 21 14:30 electro_French79_AfterParty.mp3
-rw-r--r-- 1 cas cas 0 Oct 21 14:30 electro_French79_BetweentheButtons.mp3
답변4
사용IFS구분 기호를 설정합니다. 개행 문자를 사용하면 공백이 더 이상 문제가 되지 않습니다.
IFS=$(echo -en "\n\b")
for x in $(ls -1 *.mp3); do mv "$x" "electro_${x}"; done
물론 단순히 왜 안 되느냐고 물을 수도 있습니다.
IFS='\n'
이는 $()
또는 백틱이 후행 개행 문자를 제거하는 명령 대체이기 때문입니다.
~에서BASH 매뉴얼
\n 개행 문자
\b 백스페이스 키
내 이해는 "반환"(왼쪽으로 이동)이 후행 줄 바꿈이 제거되는 것을 방지하여 for
(각) 루프를 반복할 수 있도록 한다는 것입니다.