특정 이름을 가진 파일이 포함된 모든 하위 디렉터리에 파일을 복사합니다.

특정 이름을 가진 파일이 포함된 모든 하위 디렉터리에 파일을 복사합니다.

features[30,55].R데스크탑의 스크립트 를 DONE.

다음 명령을 시도했습니다.

find . -name "DONE"  -exec sh  'cp /Users/percyli/Desktop/features[30,55].R {}' \;

그러나 다음과 같은 오류가 발생합니다.

sh: cp /Users/percyli/Desktop/features[30,55].R ./DONE: No such file or directory
sh: cp /Users/percyli/Desktop/features[30,55].R ./F3/F3-1/DONE: No such file or directory

그 중에는 ./F3/F3-1"DONE" 파일이 포함된 폴더 중 하나가 있습니다.

나는 또한 다음을 시도했습니다.

find . -name "DONE"  -exec cp /Users/percyli/Desktop/features[30,55].R {} \;

오류가 출력되지는 않지만 이 명령을 실행한 후에는 말 그대로 아무 일도 일어나지 않습니다.

여기서 문제는 무엇이며 어떻게 해결합니까?

답변1

f='/path/to/features[30,55].R'

find . -type f -name DONE \
    -exec sh -c 'echo cp "$1" "$(dirname "$2")"' sh "$f" {} ';'

sh그러면 지정된 파일을 해당 파일이 있는 디렉터리에 복사하는 스크립트가 올바르게 호출됩니다 DONE.

echo올바른 작업을 수행하고 있다고 확신하면 제거하십시오.

또는,

find . -type f -name DONE \
    -execdir cp "$f" . ';'

...당신이 find가지고 있다면 -execdir.


세 가지 질문이 있습니다.

  1. 오류는 을 생략하여 발생합니다 -c. 이는 (모두 하나의 이름)이라는 이름의 스크립트를 실행하려고 한다는 sh -c의미입니다 . 파일을 찾지 못했습니다.shcp /Users/perc...

  2. 서브셸도 파일 이름을 잘못 인용했습니다. 파일 이름 와일드카드 문자가 포함되어 있으므로 따옴표로 묶어야 합니다.

  3. 이를 {}스크립트에 넣는 것은 잠재적으로 위험할 수 있으며, 적어도 혼란스러운 결과를 낳을 수 있습니다. 예시 보기Solaris 10에서 파일 이름 대신 find/ -exec sh -c "echo {}"가 "{}"를 인쇄하는 이유는 무엇입니까?

두 번째 시도에서는 DONE이러한 파일을 R 스크립트의 내용으로 덮어씁니다. 여기서는 R 스크립트의 파일 이름도 인용해야 합니다(그러나 이렇게 해도 문제가 해결되지는 않습니다).

관련 정보