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
.
세 가지 질문이 있습니다.
오류는 을 생략하여 발생합니다
-c
. 이는 (모두 하나의 이름)이라는 이름의 스크립트를 실행하려고 한다는sh -c
의미입니다 . 파일을 찾지 못했습니다.sh
cp /Users/perc...
서브셸도 파일 이름을 잘못 인용했습니다. 파일 이름 와일드카드 문자가 포함되어 있으므로 따옴표로 묶어야 합니다.
이를
{}
스크립트에 넣는 것은 잠재적으로 위험할 수 있으며, 적어도 혼란스러운 결과를 낳을 수 있습니다. 예시 보기Solaris 10에서 파일 이름 대신 find/ -exec sh -c "echo {}"가 "{}"를 인쇄하는 이유는 무엇입니까?
두 번째 시도에서는 DONE
이러한 파일을 R 스크립트의 내용으로 덮어씁니다. 여기서는 R 스크립트의 파일 이름도 인용해야 합니다(그러나 이렇게 해도 문제가 해결되지는 않습니다).