디렉토리의 파일을 복사하는 데 문제가 있습니다.
.txt
디렉터리에 많은 파일이 있고 디렉터리를 기반으로 파일을 복사하고 싶습니다 . 예를 들면 다음과 같습니다..jpeg
.txt
direct/direct1
direct/direct2
direct1:
file.txt
file2.txt
file.jpeg
file2.jpeg
direct2:
file3.txt
file4.txt
file3.jpeg
file4.jpeg
.txt
내 복사 명령에는 각 디렉터리의 파일 만 필요합니다.
답변1
.txt
디렉토리의 모든 파일을 복사하려면 다음을 사용하십시오.와일드카드 패턴:
cp direct/direct1/*.txt target
그러면 .txt
디렉터리의 모든 파일이 direct/direct1
해당 디렉터리로 복사됩니다 target
(디렉터리는 이미 존재해야 함).
여러 패턴을 전달하여 여러 디렉터리에서 파일을 복사할 수 있습니다.
cp direct/direct1/*.txt direct/direct2/*.txt target
.txt
모든 하위 디렉터리에 파일을 복사하려면 direct
해당 디렉터리에 와일드카드를 사용할 수도 있습니다.
cp direct/*/*.txt target
특정 디렉터리에서만 복사하려는 경우 해당 디렉터리에만 일치하는 와일드카드 패턴을 사용할 수 있습니다. 예를 들어, , , 및 direct
4개의 하위 디렉토리가 있고 및 에서만 파일을 복사 하려는 경우 다음을 사용할 수 있습니다.foo
bar
baz
qux
bar
baz
cp direct/ba?/*.txt target
지금까지의 모든 예제는 direct
자체 또는 에서 파일을 복사하지 않습니다. 에서 파일을 복사 direct
하려면 해당 파일을 목록에 포함해야 합니다..txt
direct
cp direct/*.txt direct/*/*.txt target
direct
모든 하위 디렉터리, 모든 하위 디렉터리 등에서 파일을 반복적으로 복사 하려면 와일드카드를 사용할 수 있습니다 **
(셸에서 지원하는 경우). zsh에서는 즉시 작동하지만세게 때리다, 먼저 를 사용하여 활성화해야 합니다 shopt -s globstar
.
cp direct/**/*.txt target
모든 파일은 target
자체적으로 복사되므로 디렉토리 구조가 재생산되지는 않습니다. 디렉토리 구조를 재현하려면 다른 도구가 필요합니다.동기화(지도 시간) 또는공원.
rsync -am --include='*.txt' --include='*/' --exclude='*' direct/ target/
cd direct && pax -rw -pe -s'/\.txt$/&/' -s'/.*//' . target/
답변2
find
다음을 사용하여 특정 디렉터리에 있는 `.txt 파일만 선택할 수 있습니다 .
find direct/direct? -name "*.txt"
이렇게 하면 모든 파일이 인쇄되므로 원하는 파일이 있는지, 선택할 파일이 너무 많지 않은지 확인할 수 있습니다. 따옴표로 묶어야 합니다 *.txt
. 그렇지 않으면 쉘은 이를 .txt
현재 디렉토리의 파일로 확장하려고 시도합니다.
복사의 경우 (가장 일반적으로) 다음 두 가지 중 하나를 수행해야 합니다. .txt
파일에 대한 직접 경로를 유지할지 여부. 저장하려면 다음을 사용하세요.
find direct/direct? -name "*.txt" -print0 | cpio -pdmv0 target_directory
모든 파일을 대상 디렉터리에 복사하려면 .txt
@lambert의 제안과 비슷한 것을 사용하십시오.
find direct/direct? -name "*.txt" -exec cp {} target_directory +
( 를 사용할 때 각 파일에 대해 를 호출하는 대신 여러 파일 이름이 단일 파일에 전달되므로 대신 를 사용하는 것이 +
더 효율적입니다 .)\;
cp
+
cp
\;
두 번째 명령의 경우 -print0
특수 문자가 포함된 경로를 처리할 필요가 없으며 대체된 파일 이름은 {}
호출되는 방식에 따라 올바르게 구분됩니다.cp