2017-11-20 3 views
0

약 40 개의 이미지 ("1.png"에서 "40.png")로 이름을 바꾸려고합니다. 터미널에서mv 명령에서 MacOS bash 별칭이 깨졌습니다.

이 첫 번째 명령이 작동 :

user$ ls | cat -n | while read n f; do mv "$f" "$n.png"; done 

하지만 ~/.bash_profile에의 별칭에 해당 명령을하고 싶습니다.

alias rename-png="ls | cat -n | while read n f; do mv "$f" "&n.png"; done" 

alias rename-png="ls | cat -n | while read n f; do mv /"$f/" /"&n.png/"; done" 

rename-png() { 
    ls | cat -n | while read n f; do mv "$f" "$n.png"; done 
} 

따옴표가 이스케이프되지 않았기 때문에 첫 번째 별칭이 작동하지 않습니다. 그러나 큰 따옴표를 이스케이프하는 경우에도 명령은 mv에서 중단됩니다. 또한 함수에서 시도해 보았지만 작동하지 않았습니다.

오류 :

usage: mv [-f | -i | -n] [-v] source target 
     mv [-f | -i | -n] [-v] source ... directory 

누군가가 내가 잘못 뭐하는 거지 나에게 설명 할 수 있을까요?

+0

예. 'alias l = 'ls -lp''그래서 별칭 정의를 수정하고, 부분을 = in '따옴표 다음에 묶으십시오. – Nic3500

+1

[ls'의 출력을 파싱하지 않아야하는 이유] (http://mywiki.wooledge.org/ParsingLs) –

+1

BTW, * 백 슬래시 *는 슬래시가 아닌 큰 따옴표로 이스케이프 처리됩니다. '$ '를 이스케이프 처리해야합니다 (별칭을 사용하는 경우에는 작은 따옴표를 사용하는 것이 현명하지만 Chepner는 -이 사용 사례의 경우 잘못된 것임). –

답변

1

이 복합체에 별칭을 사용하지 마십시오. 그냥 함수를 사용하십시오. 또한 ls의 출력을 사용하지 마십시오. 패턴이있는 for 루프를 사용하십시오.

rename-png() { 
    i=0 
    for f in ./*; do 
    mv "$f" "$i.png" 
    i=$((i + 1)) 
    done 
} 
+1

전역 변수'i'를 남기지 않으려면'local i = 0'으로 만들 수 있습니다 (예, 원래 별칭도 그렇게했을 것입니다). –

+0

이름이 충돌 할 경우 파일을 덮어 쓰는 것을 피하기 위해'mv -n' 또는'mv -i'에 대한 나의 평소의 호소를 추가 할 것입니다. 예를 들어 "0.png"및 "1.png"파일이있는 경우 0.png를 1.png (원래 1.png을 덮어 씁니다)의 이름을 변경 한 다음 동일한 파일의 이름을 1로 변경합니다. 2.png에 png. 결과 : 0.png가 2.png가되고 1.png가 추적없이 사라집니다. –

+0

나는 이것을 test.sh에 넣는다. test.sh : 9 행 :'rename-png ': 유효한 식별자가 아니다. – UsernameError3