Linux : dir 및 subdir의 패턴과 일치하는 모든 파일을 단일 dir로 복사


31

모든 *.so파일을에서 복사 src하려면 dst다음을 수행하십시오.

cp src/*.so dst

그러나, 나는 모든 복사 할 *.soSRC에서 파일과 그것의 하위 디렉토리를dst. 단서가 있습니까?

답변:


36

시험:

find src/ -type f | grep -i so$ | xargs -i cp {} dst

17
find패턴 매칭을 수행하고 명령을 실행할 수 있습니다. 출력을 파이프 할 필요는 없습니다 :find src/ -type f -name '*.so' -exec cp '{}' dst/ ';'
jáquer

1
예, 파이프 라인을 읽는 것이 더 쉬운 경우가 많으며, 패턴 일치 기능은 매개 변수에 grep사용 된 간단한 쉘 패턴보다 훨씬 큽니다 . 또한 매개 변수 보다 훨씬 강력 합니다 . -namefindxargs-execfind
Mike Insch

2
MacOSX xargs 유틸리티에는 -i 옵션이 없기 때문에 @jaquer의 솔루션이 훨씬 좋습니다. 그러나 그의 솔루션은 매력처럼 작동합니다.
bialix

Mac에서 완벽하게 작동하는 jaquer의 솔루션에 대한 @bialix의 의견을 읽을 때까지 xargs에 대한 -i 인수에 대한 오류 메시지로 어려움을 겪고있었습니다. 감사합니다
svannoy

필요한 경우 서브 디렉토리를 작성합니까?
Lennart Rolland

15

Bash를 사용하는 경우 globstar 셸 옵션 을 파일과 디렉토리를 재귀 적으로 일치 .

shopt -s globstar
cp src/**/*.so dst

이름이 (으)로 시작하는 .파일 및 / 또는 이름이 (으)로 시작하는 디렉토리 에있는 파일을 찾으 .려면 dotglob옵션도 설정하십시오 (예 :로 shopt -s dotglob). 하나의 명령으로 둘 다 설정할 수 있습니다.

shopt -s globstar dotglob

로 시작하는 하위 디렉토리의 파일을 복사하지 않습니다. 그들의 이름으로
rboy

8

Mike가 제안한 명령을 시도했습니다.

find src/ -type f | grep -i so$ | xargs -i cp {} dst

그러나 결국 모든 파일을 디렉토리로 덤프했습니다. dst 상대 경로가 손실 된 .

상대 경로를 유지하려면 명령을 다음과 같이 수정해야합니다.

find src/ -type f | grep -i so$ | xargs -i cp {} dst/{}

7
+1. 그러나 이는 상대 소스 경로에 해당하는 디렉토리가 아래에 있다고 가정합니다 dst. 그렇지 않은 경우을 사용하십시오 cp --parents. 또한 파일 이름을 인용하십시오. 따라서 : ... | xargs -i cp --parents "{}" dst(마지막 인수 cp는 이제 대상 디렉토리 일뿐입니다). -t플래그를 사용하면 명령을 더 짧게 (아마도 더 빠르게) 수행 할 수 있습니다 ... | xargs cp --parents -t dst.
Stephan202

1
@ ... | xargs cp {} --parents -t dst.
Stephan202

Mac 사용자 --parents는 사용할 수 없습니다. ditto대신 사용 했습니다 : stackoverflow.com/questions/11246070/cp-parents-option-on-mac
Bryan Young

3

이 작업을 수행하는 다른 방법은 다음과 같습니다.

find src/ -type f -name "*.so" -exec cp {} dst/ \;

그리고 이것은 cp프로세스 수를 줄여야 ... -exec cp -t dst/ {} +합니다.
Kamil Maciorowski

카밀! 의견 감사합니다! 당신의 솔루션이 어떻게 일을 더 빠르게하는지 설명해 주시겠습니까? 항상 더 많은 것을 배우고 자합니다 :)
Kyriakos

당신이 종료 할 때 -exec;, {}한 번에 하나 개의 경로로 대체됩니다. cp모든 파일에 대해 별도의 정보 를 얻습니다 . 와 +구문 find을 대체 {}여러 결과 (명령 행 길이의 시스템 정의 한계까지, 제한 : {}전에 마지막이어야 +따라서 cp -t). 프로세스를 생성하고 종료하는 것은 상대적으로 비용이 많이 듭니다. +따라서 많은 결과를 기대할 때마다 사용하는 것이 좋습니다 . 이 경우 많은 파일을 복사하면 어쨌든 많은 시간이 걸리므로 차이가 눈에 띄지 않게 될 수 있습니다. 그럼에도 불구하고 좋은 습관입니다.
Kamil Maciorowski 님이

1

grep은 find-name 을 사용하여 대체 할 수 있습니다 .

find src/ -type f -name "*.so" | xargs -i cp {} dst/{}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.