답변:
사람들이 find를 사용하는 것을 거부하는 이유가 -exec
있습니까? 매우 편리합니다.
find . -name '*.csv' -exec cp --parents \{\} /target \;
도구를 아십시오. ;-)
'{}'
마찬가지로 작동
-execdir
보다 안전 하지만 -exec
, 단순히 하나를 다른 것으로 바꾸어도 의도 한대로 폴더 구조가 유지되지는 않습니다.
rsync
이것을 위해 사용할 수도 있습니다 .
$ rsync -a --prune-empty-dirs --include '*/' --include '*.csv' --exclude '*' source/ target/
소스 트리에서 빈 디렉토리를 유지하려면 --prune-empty-dirs
옵션을 건너 뜁니다 .
$ rsync -a --include '*/' --include '*.csv' --exclude '*' source/ target/
심볼릭 링크, 수정 날짜, 파일 권한, 소유자 등을 보존 하지 않으 려면 -a
다른 조합으로 바꾸십시오 -rlptgoD
. ;-)
-m
에 대한 바로 가기입니다 --prune-emty-dirs
.
-R
소스의 상위 디렉토리 구조를 복사하기 위해 옵션을 추가 할 수 있습니다. (cf. 내 답변은 여기에 있습니다.)
통과 모드에서 find 및 cpio 를 사용할 수 있습니다
find . -name '*.csv' | cpio -pdm /target
이것은 현재 디렉토리와 그 아래에서 모든 .csv 파일을 찾아서 루트로 지정된 디렉토리 구조를 유지하면서 / target에 복사합니다 .
.
당신이 사용하는 경우
find /path/to/files -name '*.csv' | cpio -pdm /target
모든 파일을 /path/to/files
아래 에서 찾아서 아래로 복사합니다 /target/path/to/files
.
이 cp
명령은 여러 소스 인수를 허용합니다.
cp **/*.csv --parents ../target
주의 사항 : 저는 여기 재귀 글로브를 사용하고 있습니다. 이것은 globstar
Bash 4+ 및 의 옵션이며 ksh
기본적으로에서 지원됩니다 zsh
. 재귀 글로브 는 숨겨진 파일 및 폴더와 일치 하지 않으며 일부 구현은 심볼릭 링크를 따르지만 다른 구현은 그렇지 않습니다 .
쉘이 재귀 글로브를 지원하지 않거나 사용하지 않으려면 다음을 수행하십시오.
*.csv */*.csv */*/*.csv */*/*/*.csv
-이것은 물론 매우 중복되며 디렉토리 구조의 깊이를 알아야합니다.$(find . -name '*.csv')
-이 됩니다 숨김 파일 및 폴더를 일치합니다. find
또한 심볼릭 링크를 따를 지 여부를 지정하는 데 도움이되므로 유용 할 수 있습니다.shopt -s globstar
명령 바로 직전에 실행하여 모든 문제를 해결했습니다 . 후속 감사합니다!
--parents
내가 찾던 것이 었습니다. 감사합니다
이것은 나를 위해 일했다 :
find -name "*.csv" | xargs cp --parents -t /target
find [things] | xargs [do stuff]
에 매우 강력합니다.
find -print0
및 로 처리 할 수 있습니다 xargs -0
.
에서 rsync
의 맨 :
-R,-상대
상대 경로를 사용하십시오. 이는 명령 행에 지정된 전체 경로 이름이 파일 이름의 마지막 부분이 아닌 서버로 전송됨을 의미합니다. 이것은 여러 개의 다른 디렉토리를 동시에 보내려는 경우에 특히 유용합니다. 예를 들어,이 명령을 사용한 경우 :
rsync -av /foo/bar/baz.c remote:/tmp/
... 이것은 원격 시스템의 / tmp /에 baz.c라는 파일을 만듭니다. 대신에
rsync -avR /foo/bar/baz.c remote:/tmp/
그러면 /tmp/foo/bar/baz.c라는 파일이 전체 경로를 유지하면서 원격 시스템에 작성됩니다. 이러한 추가 경로 요소를 "암시 적 디렉토리"(예 : 위 예에서 "foo"및 "foo / bar"디렉토리)라고합니다.
따라서 이것은 작동합니다.
rsync -armR --include="*/" --include="*.csv" --exclude="*" /full/path/to/source/file(s) destination/