2012-10-19 3 views
0

나는 명령을 가질 수에서 하나의 디렉토리와 같은 쉘 스크립트의 다른xargs 및 cp와 결합 된 ls 명령이 왜 10 개의 파일 만 이동합니까?

FILE_COLLECTOR_PATH="/var/www/"; 
FILE_BACKUP_PATH='/home/' 
ls $FILE_COLLECTOR_PATH | head -${1} | xargs -i basename {} | xargs -t -i cp $FILE_COLLECTOR_PATH{} "${FILE_BACKUP_PATH}{}-`date +%F%H%M%S%N`" 

I 루프 그것에 복사 파일,

#!/bin/sh 
SLEEP=120 
FILE_COLLECTOR_PATH="/var/www/"; 
FILE_BACKUP_PATH='/home/' 
while true 
do 
ls $FILE_COLLECTOR_PATH | head -${1} | xargs -i basename {} | xargs -t -i cp $FILE_COLLECTOR_PATH{} "${FILE_BACKUP_PATH}{}-`date +%F%H%M%S%N`" 
sleep ${SLEEP} 
done 

그러나 만 10 파일과 모든 파일을 이동하는 것 그 임무, 왜? 모든 파일을 이동한다고 가정해야합니다.

ls -1가하는 각 파일에 대한

답변

1

일반적으로 don't try to parse the output of ls in a script입니다. 많은 다른 유형의 미묘한 문제로 끝날 수 있습니다. 거의 항상 더 나은 도구가 있습니다. 여러 번이 도구는 find입니다. 예를 들어, 디렉토리에있는 모든 파일의 목록을 생성하고 각각에 뭔가를, 당신은 같은 것을 할 것입니다 :

find <search directory> -maxdepth 1 -type f -print0 | xargs -0i basename {} ... 

-print0-0 인수 findxargs가에서 파일 이름을 통신 할 수 있도록 특수 문자 (공백과 같은)를 올바르게 처리하는 방법.

find 명령에는 백업 스크립트 (작성중인 것으로 보이는 부분)에서 유용 할 수있는 다른 옵션이 있습니다. -mmin-newer과 같은 옵션을 사용하면 마지막 반복 이후에 변경된 파일 만 백업 할 수 있습니다.

+0

조언 주셔서 감사합니다. 찾을 것입니다. –

1

봅니다 기본적으로 ls가 줄 바꿈에없는 표시 파일을하기 때문에, 대신 ls

ls -1 

일 (tail 예상 줄 바꿈).

+0

나는 시도했지만, 여전히 하나의 루프에 대해서만 10 개의 파일을 복사한다. –

+0

네가 맞다. 내 실수는 이제 괜찮아. –