ls가 반환한 파일을 반복하는 방법

ls가 반환한 파일을 반복하는 방법

첫 번째와 두 번째 호출은 비교를 위한 것입니다. 출근을 시도하는 것은 이번이 세 번째입니다.

$ 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(각) 루프를 반복할 수 있도록 한다는 것입니다.

이에 대해서는 다음에서 더 자세히 논의됩니다.일부 다른 스택 오버플로 질문

관련 정보