오늘 만든 디렉터리 집합을 다른 디렉터리에 복사하는 스크립트를 작성하려고 합니다.
나는 현재 다음을 사용하고 있습니다 :
find /test/downloads/ -mindepth 1 -maxdepth 1 -type d -mtime -1 -printf '%f\n' | xargs -I '{}' cp -R '{}' /test/uploads/
하지만 이로 인해 오류가 발생했습니다.
cp: cannot stat 'foo': No such file or directory
내가 무엇을 놓치고 있나요?
답변1
-printf '%f\n'
현재 파일 경로의 끝과 개행 문자를 인쇄하는 GNU 확장입니다. 파일 경로가 이면 /test/downloads/foo
인쇄합니다 foo\n
.
xargs
이 출력을 얻으십시오. 여기에는 with (따옴표 문자, 개행 문자(유일한 구분 기호 ) 및 선행 공백, EOF 문자) 로 특별히 처리되는 문자가 foo
포함되지 않습니다 .xargs
-I{}
-I
So 는 에 전달된 인수로 {}
대체됩니다 . 따라서 결국 , , 을 매개변수로 하여 호출됩니다.foo
cp
cp
cp
-R
foo
/test/uploads/
cp
따라서 검색은 .dll이 아닌 현재 작업 디렉터리에서 이루어집니다 .foo
/test/downloads
파일이 이미 호출된 경우 /test/downloads/-t..
명령은 다음과 같습니다.
cp -R -t.. /test/uploads/
현재 작업 디렉토리의 상위 디렉토리에 cp
복사 하라고 지시합니다 ./test/uploads/
파일 이름이 이면 /test/downloads/ 'blah'<newline>"blah"
두 cp
번 호출됩니다 cp -R blah /test/uploads/
.
따라서 두 가지 질문이 있습니다.
- 다음 을 사용하여
%f
주요 디렉터리 구성 요소를 파일로 제거할 수 있습니다. - 사용 중인 항목이
xargs
출력에서 안정적으로 작동하지 않습니다find
(비표준 옵션을 사용-r
하고-0
NUL로 구분된 레코드를 처리하는 것 제외).
cp
또한 한 번에 여러 파일을 복사할 수 있지만 cp
각 디렉터리를 호출한다고 덧붙일 수도 있습니다 .
여기서 표준은 다음과 같아야 합니다.
find /test/downloads/. ! -name . -prune -type d -mtime -1 -exec sh -c '
exec cp -R "$@" /test/uploads/' sh {} +
이러한 유틸리티(Debian 시스템에서 기본적으로 발견됨)의 GNU 구현을 사용하면 다음과 같이 단순화할 수 있습니다.
find /test/downloads/ -mindepth 1 -maxdepth 1 -type d -mtime -1 \
-exec cp -Rt /test/uploads/ {} +
답변2
" "라는 파일이 있을 수 있습니다 foo bar
.
더 나은 접근 방식은 -printf ...
처음부터 끝까지 다음으로 대체하는 것입니다.
-print0 | xargs -0 -r cp -t /Test/Uploads
읽다 man find xargs cp
.