cp를 사용하여 빈 디렉터리가 있는 디렉터리에서 파일을 복사하면 오류 반환 값이 발생하여 스크립트가 실패합니다.
오류 반환 값 없이 디렉터리를 건너뛰는 방법이 있나요? 오류 값을 오류 값에 반영하고 싶지만, 거기에 빈 디렉터리가 있으면 오류로 보고되지 않고 건너뛰어야 합니다.
재귀 플래그를 추가할 수도 있지만 -r
디렉토리가 복사되는 것을 원하지 않지만하다오류가 보고되기를 원하시나요?
답변1
cp 대신 rsync를 사용하는 것이 좋습니다. 가능하다면 빈 폴더를 제외하는 -m 옵션이 있습니다. 예:
rsync -am <origin> <destination>
명령에 대한 설명explainshell.com
저는 -a 옵션을 사용하고 있는데, 그 이유는 이 옵션이 훌륭한 기본 작업을 많이 수행하기 때문입니다. 그러나 원할 경우 재귀 모드만 설정하는 -r 옵션도 사용할 수 있습니다.
[댓글 추가]
나는 cp를 사용하여 이 작업을 수행하는 방법을 모릅니다. 적어도 매뉴얼 페이지에는 해당 작업을 수행할 수 있는 옵션이 표시되지 않습니다. 명령을 사용하여 find
복사할 파일/디렉토리 목록을 찾은 다음 이를 cp에 전달하면 더 복잡한 솔루션을 수행할 수 있지만 이는 rsync보다 훨씬 더 복잡합니다. rsync는 많은 Linux에서 거의 표준입니다.
답변2
cp
실제로 파일만 가져오는 옵션은 없지만광포한find
와 함께 사용할 수 있습니다 cp
. 실제로 이것은 매우 간단합니다.
# Copy only files
find /path/to/file -type f -execdir cp "{}" /dest/path ";"
또는:
# Copy everything except directories
find /path/to/file -not -type d -execdir cp "{}" /dest/path ";"
설명
find
원하는 파일을 찾는 도구입니다. 첫 번째 옵션에서는 -type f
일반 파일만 반환하도록 설정했습니다. 두 번째 옵션에서는 -not -type d
디렉터리를 제외한 모든 항목을 가져오도록 설정했습니다. 한 번에 하나의 결과 항목으로 바꾸기 find
위해 전달된 인수를 실행하고 가 발견 되면 명령을 중지합니다 ( 또는 로 이스케이프해야 하거나 셸이 이를 확장할 수 있음).-execdir
{}
;
;
\;
";"
-execdir
는 파일 폴더를 "작업 디렉터리"로 사용하여 명령을 실행하며 대신 -exec
아래를 확인하는 것이 좋습니다.
옵션 -type
문서:
-c 유형
파일 유형은 c입니다.
b: 블록(버퍼) 특수
c: 문자(버퍼되지 않음) 특수
d: 디렉토리
p: 명명된 파이프(FIFO)
f: 일반 파일
l: 심볼릭 링크; -L 옵션이나 -follow 옵션이 적용되는 경우 기호 링크가 끊어지지 않는 한 이는 결코 사실이 아닙니다. -L이 적용될 때 기호 링크를 검색하려면 -xtype을 사용하십시오.
들: 소켓
D: 문(Solaris)
옵션 -not
문서:
!특급
expr이 거짓이면 참입니다. 이 문자는 일반적으로 쉘에 의한 해석으로부터 보호되어야 합니다.
-아니다특급
과 동일합니다! expr이지만 POSIX와 호환되지 않습니다.
옵션 -execdir
문서:
-exec명령 ;
실행하다명령;0 상태가 반환되면 true입니다. find에 대한 다음 인수는 모두 ';'로 구성된 인수가 나올 때까지 명령에 대한 인수로 간주됩니다. 발생합니다. 문자열 '{}'은 명령 [...]에 대한 인수에서 나타나는 모든 곳에서 처리 중인 현재 파일 이름으로 대체됩니다. 이러한 구성은 모두 셸에 의한 확장으로부터 보호하기 위해 이스케이프('\' 사용)되거나 인용되어야 할 수 있습니다. 지정된 명령은 일치하는 각 파일에 대해 한 번 실행됩니다. 명령은 시작 디렉터리에서 실행됩니다.-exec 작업 사용과 관련하여 피할 수 없는 보안 문제가 있습니다. 대신 -execdir 옵션을 사용해야 합니다.
-execdir명령 ;
-exec와 비슷하지만 지정됨명령은 일치하는 파일이 포함된 하위 디렉터리에서 실행됩니다., 이는 일반적으로 찾기를 시작한 디렉토리가 아닙니다. 이는 일치하는 파일에 대한 경로를 확인하는 동안 경쟁 조건을 방지하므로 명령을 호출하는 훨씬 더 안전한 방법입니다. [...] 이 옵션을 사용하는 경우 $PATH 환경 변수가 '.'를 참조하지 않는지 확인해야 합니다. 그렇지 않으면 공격자는 -execdir을 실행할 디렉터리에 적절한 이름의 파일을 남겨두어 원하는 명령을 실행할 수 있습니다. $PATH에 비어 있거나 절대 디렉토리 이름이 아닌 항목이 있는 경우에도 마찬가지입니다.