다음 예를 고려하십시오.
touch test0
touch timestamp
touch test1
sudo find /var/www/import -iname 'test*' -newer timestamp -exec cp {} new \;
실제로 test1 파일을 복사하지만 다음 메시지를 반환합니다.
cp: `/var/www/import/new/test1' and `new/test1' are the same file
내가 뭘 잘못했나요?
두 번째 질문입니다. 파일을 단일 "패키지"에 복사하기 위해 이 명령에 "+"를 사용할 수 있습니까? 수천 개의 파일이 있습니다!
답변1
내가 뭘 잘못했나요?
그것은 중요하지 않습니다. find
복사된 파일이 발견 new
되어 다시 복사를 시도하여 경고 메시지가 표시됩니다.
파일이 단일 "패키지"에 복사되도록 이 명령에 "+"를 사용할 수 있습니까? 수천 개의 파일이 있습니다!
예, 하지만 다음과 같이 명령을 수정해야 합니다.
find /var/www/import -iname 'test*' -newer timestamp -exec cp -t new {} +
왜냐하면 {}
이 경우에는 exec 문의 끝에 있어야 하기 때문입니다.
답변2
echo
전에 하나를 추가하면 cp
그것이 작동하는 것을 볼 수 있습니다
cp new/test1 new
cp test1 new
find
이는 현재 디렉터리뿐만 아니라 모든 하위 디렉터리도 검색하기 때문입니다 .
대안:
find
하위 디렉터리를 보지 않도록 지시합니다 :
find /var/www/import -maxdepth 1 \
-iname 'test*' -newer timestamp -exec cp {} new \;
find
하위 디렉터리를 무시 하도록 지시합니다 new
.
find /var/www/import -type d -name new -prune -o \
-iname 'test*' -newer timestamp -exec cp {} new \;
다음 디렉터리에서 파일을 복사합니다 /var/www/import
.
find /var/www/import \
-iname 'test*' -newer timestamp -exec cp {} /var/www/import.new \;
그러나 하위 디렉터리가 있으면 결국 동일한 이름을 가진 모든 파일을 잃게 됩니다.
예를 들어 다음과 같은 경우
test0
test1
scripts/test1
그러면 당신은 결국
test0
test1
new/test1
scripts/test1
어느 것이 test1
복사됩니까 new
?
이를 처리하는 방법에는 몇 가지가 있지만 제가 생각할 수 있는 가장 간단하고 효율적인 방법은 다음을 사용하는 것입니다.cp --parents
cd /var/www/import
find . -type d -name new -prune -o \
-type f -iname 'test*' -newer timestamp -exec cp --parents {} new \;
그게 너에게 줄거야
test0
test1
new/test1
new/scripts/test1
scripts/test1
Rush는 이미 질문의 두 번째 부분에 답변했으므로 다시 반복하지 않겠습니다.