2012-10-27 2 views
-1

다음 논리를 실행하는 while 루프에 inotifywait가 파이프되는 스크립트가 있습니다.이 루프를 수행하는 올바른 방법은 무엇입니까

 cp "$S3"/2/post2.png "$S3"; 
    mv "$S3"/1/post1.png "$S3"/2/post2.png; 
    cp "$S3"/3/post3.png "$S3"; 
    mv "S3"/post2.png "$S3"/3/post3.png; 

등등 등등 ..... 다음 스크립트의 끝에 ...

 mv "$dir"/$file "$S3"/1/post1.png 

그 라인은 신선한 게시물을 나타내고, 위에서 언급 한 이전 게시물의 회전이다.

필자는 반복을 100 번 이상 진행할 수 있지만 더 효율적으로 프로그래밍하고 시간을 절약하고 싶습니다.

그래서 이것을 반복하는 올바른 방법은 무엇입니까?

+0

네 번째 라인이 옳지 않다고 생각합니다. 'mv "$ S3"/2/post2.png "$ S3"/ 3/post3.png'일까요? –

+0

가장 오래된 게시물은 어떻게됩니까? 그것이 사라지거나 새로운 디렉토리'$ 3/nnn'이 생성됩니까? – Serge

+0

모든 우편 번호를 하나씩 이동하려고하십니까? 반대로 들어가는 건 어때? –

답변

1

더 좋은 메커니즘은 역순으로 숫자가 "$S3" 인 디렉토리를 나열하고이를 처리하도록 정렬한다고 생각합니다. 100 개의 디렉토리가 모두 존재하는지 또는 생성해야하는지 여부는 명확하지 않습니다. 우리는 디렉토리 1..100이 존재할 수 있다고 가정하고 디렉토리 N은 항상 postN.png만을 포함 할 것입니다.

파일 경로에 공백, 개행 문자 또는 기타 어색한 문자가 없다고 가정합니다. 즉, 너무 위험하지 않고 ls을 사용할 수 있습니다.

for dirnum in $(cd "$S3"; ls */*.png | sed 's%/.*%%' | sort -nr) 
do 
    next=$(($dirnum + 1)) 
    mv "$S3/$dirnum/post$dirnum.png" "$S3/$next/post$next.png" 
done 

cd "$S3"은 출력에 가능한 긴 경로명을 포함하지 않는다는 것을 의미합니다. ls */*.png은 존재하는 파일을 나열합니다. sed는 파일 이름과 슬래시를 제거하고 파일이 들어있는 디렉토리 번호 목록 만 남겨 둡니다. 정렬은 디렉토리를 역순으로 정렬합니다.

나머지는 이미 필요한 디렉토리가 존재한다는 가정하에 간단합니다. 파일을 이동하기 전에 [ -d "$S3/$next" ] || mkdir -p "$S3/$next"을 추가하는 것은 어렵지 않습니다. 루프가 끝나면 최종 명령을 사용할 수 있습니다.

mv "$dir/$file" "$S3/1/post1.png" 

완전한 이름은 큰 따옴표로 묶었습니다. 예기치 않게 공간이 확보되면 일반적으로 불쾌감이 줄어 듭니다.

+0

너무 아프다! 당신은 코드를 제한된 단어로 완벽하게 문제를 이해했습니다! 나는 당신의 코드에 놀랐다. 당신은 내 마음을 열어 줄뿐입니다 ... 루프 에서뿐만 아니라 모든 명령을 파이프하여 변수를 만듭니다. FLAWLESS !! 고마워요! – sirvon

0

이 시도 :

for i in $(ls -r1 "$3"); do 
    mkdir -p "$3/$((i+1))" 
    mv "$3/$i/post$i.png" "$3/$((i+1))/post$((i+1)).png" 
done 
mv "$dir"/$file "$S3"/1/post1.png 

루프는 역순으로 모든 디렉토리를 통해 반복하고 파일을 이동합니다.