xargs를 사용하여 디렉토리 복사

xargs를 사용하여 디렉토리 복사

오늘 만든 디렉터리 집합을 다른 디렉터리에 복사하는 스크립트를 작성하려고 합니다.

나는 현재 다음을 사용하고 있습니다 :

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 는 에 전달된 인수로 {}대체됩니다 . 따라서 결국 , , 을 매개변수로 하여 호출됩니다.foocpcpcp-Rfoo/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/.

따라서 두 가지 질문이 있습니다.

  1. 다음 을 사용하여 %f주요 디렉터리 구성 요소를 파일로 제거할 수 있습니다.
  2. 사용 중인 항목이 xargs출력에서 ​​안정적으로 작동하지 않습니다 find(비표준 옵션을 사용 -r하고 -0NUL로 구분된 레코드를 처리하는 것 제외).

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.

관련 정보