2012-12-23 4 views
0

지금이 같은 이름 바꾸기 스크립트가 :쉘 스크립트 이름 바꾸기

cd /Users/KanZ/Desktop/Project/Test/ 
n=1 
for file in *.jpg; do 
    echo $file 
    prefix=M 
    file_name=M$n.jpg 
    echo $file_name 
    n=$(($n+1)) 
    mv $file $file_name 
done 

내가 스크립트를 실행하는 경우 난을 추가하는 경우, JPG 파일의 모든 M1.jpg M2.jpg M3.jpg 될 것이지만 첫 번째 새 파일 이름 A1.jpg를이 디렉토리에 추가하고 스크립트를 다시 실행하십시오. All of M1.jpg M2.jpg M3.jpg는 첫 번째 문자가 A이기 때문에 M4.jpg (실행 스크립트 이전에이 파일은 A1.jpg로 바뀜)로 대체됩니다. M보다 앞에옵니다. 이것은 제 문제입니다. M1 M2 M3 M4.jpg를 받고 싶습니다. 새 파일이 올 때마다이 스크립트는 M5.jpg M6.jpg와 같은 계속 이름을 생성합니다. 코드는 어떻게 생겼습니까? 당신이 그것을 이해하기를 바랍니다.

+0

스크립트가 매우 손상된 것 같습니다. 여기에 복사하여 붙여 넣을 때 문제가 발생했다고 생각합니다. 특히 필요한 줄 바꿈이 누락 된 것 같습니다. – ruakh

+0

[Guard] (https://github.com/guard/guard)를 확인하십시오 – ocodo

답변

-1

이 작은 스크립트가 그것을 수행합니다.

어떻게 작동하는지보십시오.

test/rename$ for x in 1 2 3; do echo A$x> A$x.jpg; done; 
test/rename$ ls 
A1.jpg A2.jpg A3.jpg 
test/rename$ cat ../rnm.sh 
#!/bin/bash 
cd "$1" 
n=$(ls -1 | grep '^M' -c) 
nfiles=$(ls -1 *.jpg| grep -v '^M'); 
for file in $nfiles; 
do 
    n=$(($n+1)); 
    new_file=M$n.jpg 
    mv $file $new_file 
done 
test/rename$ bash ../rnm.sh ./ 
test/rename$ ls 
M1.jpg M2.jpg M3.jpg 
test/rename$ for x in 1 2 ; do echo B$x> B$x.jpg; done; 
test/rename$ ls 
B1.jpg B2.jpg M1.jpg M2.jpg M3.jpg 
test/rename$ bash ../rnm.sh ./ 
test/rename$ ls 
M1.jpg M2.jpg M3.jpg M4.jpg M5.jpg 
test/rename$ for x in *.jpg; do echo $x; cat $x; done; 
M1.jpg 
A1 
M2.jpg 
A2 
M3.jpg 
A3 
M4.jpg 
B1 
M5.jpg 
B2 
+0

와우 !! 잘 작동합니다. 고마워요. :) – kantawit

+0

@ kantawit 대답을 수락하십시오. :) –

+0

그리고 M1.jpg에서 시작하는 방법. 이제 M2.jpg에서 시작합니다 – kantawit

-1

내가 귀하의 요구 사항을 이해하는 방법을 도와 u를 감사하는 것입니다 : 그들은 동안 M.

을 다음 증분 번호와 M의 *의 .JPG를 가지고 무엇을 적 이름에서

변경 모든 .jpg 파일 이름 프로그램을 여러 번 실행하면 마지막 실행 중에 설정 한 M 파일의 가장 높은 값에서 카운트가 증가합니다. 예를 들어 프로그램의 첫 번째 실행이 M1, M2, M3을 만든 다음 더 많은 파일을 추가하는 경우 M4, M5, M6부터 시작해야합니다.

하지만 M1, M2, M3 자체는 변경하면 안됩니다.

그래서 몇 가지 제안 :

당신은 스크립트의 시작 부분에 N = 1로 설정된다. 이전 실행에서 파일에있는 Mx.jpg의 최고 값을 사용해야합니다.

둘째, 파일을 찾고 반복 할 때 모든 M * .jpg 파일을 제외하고 이름이 바뀌지 않도록합니다.

귀하의 요구 사항이라고 생각하십니까? 추가 입력 사항이있는 경우 의견을 추가하십시오. 다음 댓글에서 스크립트를 보냅니다.

테스트 사례 : 기존 파일, X.jpg, ASG.jpg, GER.jpg 파일 이름을 실행 후 : M1.jpg가, M2.jpg, M3.jpg

방금 ​​스크립트를 실행하는 경우 첫 번째 실행 후 추가 파일없이 한 번 더 : 파일 이름에 변경 사항이 없어야합니다 : M1.jpg, M2.jpg, M3.jpg.

지금 이상의 파일을 추가합니다 Z.jpg, A.jpg, B.jpg 을 다음과 같이 파일 이름을 변경해야합니다 :

M1.jpg => M1.jpg, M2.jpg => M2합니다. jpg, M3.jpg => M3.jpg, A.jpg => M4.jpg, B.jpg => M5.jpg, Z.jpg => M6.jpg. 파일 이름은 M1.jpg, M2.jpg, M3.jpg, M4.jpg, M5.jpg, M6jpg입니다.

+0

네, 생각하는 모든 것이 맞습니다 !! 이해 해주셔서 감사합니다. 쉘 스크립트를 작성하는 방법을 이해할 수 없기 때문에 코드를 제공 할 수 있습니다. – kantawit

+0

n ='ls -l M * .jpg | wc -l'; n = $ (($ n + 1));'ls * .jpg | 파일의 경우 $ n을 에코합니다. grep -v "M. * \. jpg"'; 할 에코 $ 파일 접두사 = 0M FILE_NAME = M $ n.jpg 에코 $ FILE_NAME N = $ (($ N + 1)) MV $ 파일 $ file_name을 수행 – kcsarath

+0

에 대한 본질적으로 나쁜 아무것도 없다 @gniourf_gniourf ls를 포함하여 명령의 출력을 구문 분석합니다. 결과를 파싱하는 특정 방법이 왜 효과가 없거나 특히 까다로운 지에 대한 건설적인 의견이있는 경우이를 말하십시오. "나쁜"것에 대한 의견을 표명하지 마십시오. 모욕은 일반적으로 사람들에게 영향을주는 좋은 방법이 아닙니다. –

0

다른 답변은 당신에게 좋은 습관을 보여주지 못합니다.

다음은 번호가 연속이라고 가정 일 가능성 (즉, M4.jpg에서 M6.jpg없이 점프).이 가정이 없다면 스크립트는 안전합니다 (기존 파일을 덮어 쓰지 않지만 특정 파일의 이름은 변경하지 않음).

#!/bin/bash 

shopt -s extglob 
shopt -s nullglob 

cd /Users/KanZ/Desktop/Project/Test/ 

# Determine how many files MX.jpg you have (with X a number): 
files=(M+([[:digit:]]).jpg) 
n=${#files[@]} 

for file in !(M+([[:digit:]])).jpg; do 
    file_name=M$((++n)).jpg 
    mv -vn -- "$file" "$file_name" 
done 
  • -n 옵션 mv에 : 장황 (그래서 당신은 당신이했던 에코 필요하지 않습니다)
  • : 더 소지품은
  • -v 옵션 mv에 (이미 존재하는 파일을 덮어하지 않음)
  • -- thing : 옵션 끝, 인수가 뒤에서 발견됩니다 (일부 파일이 하이픈으로 시작하는 경우에 대비하여, mv을 혼동시킬 수 있습니다).