find -exec cp 관련 문제

find -exec cp 관련 문제

다음 예를 고려하십시오.

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는 이미 질문의 두 번째 부분에 답변했으므로 다시 반복하지 않겠습니다.

관련 정보