폴더 구조를 유지하면서 특정 파일 형식 복사
On 2월 10, 2021 by admin여러 폴더에 * .csv 파일이 흩어져있는 폴더 구조가 있습니다. 이제 모든 * .csv 파일을 폴더 구조를 유지하면서 다른 대상으로 복사하려고합니다.
다음을 수행하여 작동합니다.
cp --parents *.csv /target cp --parents */*.csv" /target cp --parents */*/*.csv /target cp --parents */*/*/*.csv /target ...
및 하지만 하나의 명령을 사용하여 수행하고 싶습니다.
답변
find
에는 매우 편리한 -exec
옵션이 있습니다.
find . -name "*.csv" -exec cp --parents \{\} /target \;
댓글
- 아마도이 때문에 \ {\} \;
-
'{}'
도 잘 작동합니다. -
-execdir
는-exec
보다 안전합니다. 하나를 다른 것으로 바꾸는 것만으로는 폴더 구조가 의도 한대로 유지되지 않습니다. - 왜 내가 명령으로 디렉토리를 복사하려고 할 때 ' 디렉토리 생략 ' 메시지가 표시됩니까?
- 여기에서 중괄호를 이스케이프해야합니까?
Answer
rsync
$ rsync -a --prune-empty-dirs --include "*/" --include "*.csv" --exclude "*" source/ target/
소스 트리에서 빈 디렉토리를 유지하려면 --prune-empty-dirs
옵션을 건너 뜁니다.
$ rsync -a --include "*/" --include "*.csv" --exclude "*" source/ target/
심볼 링크, 수정 날짜, 파일 권한, 소유자 등을 보존하지 않으려면 와 -rlptgoD
의 다른 조합. 😉
댓글
답변
찾기를 사용할 수 있습니다. 통과 모드의 a> 및 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
이하로 복사합니다. .
댓글
- 이 질문에 대한 모든 답변을 위에서 아래로 시도했는데 이것이 첫 번째 시도에서 작동 한 유일한 답변입니다.
li>
- 정답이 될 것입니다.
- GNU 문서 가 유용하다는 것을 알았습니다. " 복사 통과 모드에서 [
-p
옵션에 의해 요청 된 cpio]는 표준 입력에서 복사 할 파일 목록을 읽습니다. 복사 할 디렉토리는 비 옵션 인수로 제공됩니다. " … " -d 필요한 곳에 선행 디렉토리를 만듭니다. " … " -m 이전 파일 수정 시간 유지 파일을 만들 때. "
답변
cp
명령은 여러 소스 인수를 허용합니다.
cp **/*.csv --parents ../target
CAVEAT : 여기서는 재귀 glob을 사용하고 있습니다. 이것은 Bash 4+ 및 iv id = “의 globstar
옵션입니다. b3bedba95c “>
이며 기본적으로 zsh
에서 지원됩니다. 재귀 glob은 지원하지 않습니다 는 숨겨진 파일 및 폴더와 일치하며 일부 구현은 심볼릭 링크를 따르지만 다른 구현은 그렇지 않습니다 .
셸이 일치하지 않는 경우 ” t supp ort 재귀 glob을 사용하거나 “사용하지 않으려는 경우 다음을 수행 할 수 있습니다.
-
*.csv */*.csv */*/*.csv */*/*/*.csv
-물론 이것은 매우 중복되며 디렉토리 구조의 깊이를 알아야합니다. -
$(find . -name "*.csv")
-이 는 숨겨진 파일 및 폴더와 일치합니다.find
는 심볼릭 링크를 따르는 지 여부를 지정하는 것도 지원하므로 유용 할 수 있습니다.
댓글
- 이것은 정확히 내가 시도한 것입니다 (재귀 적 글롭). 전부는 아니지만 일부를 찾았습니까? 꽤 이상합니다. npm copyfiles 스크립트를 사용할 때 동일한 결과를 얻었지만 find 명령을 사용하면 모든 것을 찾습니다 …
- @Randyaa I ' 도움을 드리기 위해 정확히 어떤 파일을 찾을 수 없었는지 ' 자세히 알아보세요. 재귀 glob의 정확한 동작에 대한 토론은 여기 에서 찾을 수 있으며 여기 에서 유용하게 사용할 수 있습니다. .
- 어떤 이유로 재귀 glob이 ' 활성화되지 않은 것으로 나타났습니다 …저는 ' 이전에이 문제를 경험 한 적이 없지만 명령 직전에
shopt -s globstar
를 실행하여 문제를 수정했으며 모든 것이 잘되었습니다. 후속 조치를 해주셔서 감사합니다! -
--parents
가 제가 찾고 있던 것입니다. 감사합니다
답변
저에게 효과적이었습니다.
find -name "*.csv" | xargs cp --parents -t /target
댓글
- 가장 간단한 구문을 사용한 최상의 답변입니다. 잘 작동하고 기억하기 쉽습니다. 대부분의 경우
find [things] | xargs [do stuff]
는 매우 강력합니다. - 동의합니다. 다른 답변에 비해 매우 간단합니다.
- 파일 이름에 공백이있는 경우 중단
- @MichelePiccolini 파일 이름의 공백은
find -print0
및xargs -0
.
답변
“의 맨 페이지 :
-R, –relative
상대 경로를 사용합니다. 이는 명령 줄에 지정된 전체 경로 이름이 파일 이름의 마지막 부분 만이 아니라 서버로 전송됨을 의미합니다. 이것은 여러 개의 다른 디렉토리를 동시에 전송하려는 경우 특히 유용합니다. 예를 들어 다음을 사용한 경우 이 명령 :
rsync -av /foo/bar/baz.c remote:/tmp/
… 이것은 원격 시스템의 / tmp /에 baz.c라는 파일을 생성합니다. 대신 사용한 경우
rsync -avR /foo/bar/baz.c remote:/tmp/
그러면 /tmp/foo/bar/baz.c라는 파일이 원격 시스템에 생성되어 전체 경로가 유지됩니다. 이러한 추가 경로 요소를 ” 암시하다 ed 디렉토리 “(예 : 위의 예에서 “foo”및 “foo / bar”디렉토리).
따라서 이것도 작동합니다.
rsync -armR --include="*/" --include="*.csv" --exclude="*" /full/path/to/source/file(s) destination/
댓글
- 이 답변을 제공해 주셔서 감사합니다. BSD userland (macOS), 및 공백이있는 경로와 호환됩니다.
Answer
이 구조를 ./source
에서 ./destination
로 복제한다고 가정합니다.
cd source find . -name "*.csv" | xargs tar cvf - | (cd ../destination ; tar xfp -)
나는 그것을 한 줄로 계산할 준비가되어 있습니다. cd source
는 쉘 내장입니다.
댓글
-
tar
에는 디렉토리를 먼저 변경하지 않아도되는-C
옵션이 있습니다.
-m
는--prune-emty-dirs
.-R
옵션을 추가하여 소스의 상위 디렉토리 구조를 복사 할 수 있습니다. (cf. 여기에 내 대답이 있습니다.)