모든 하위 디렉토리에서 특정 확장자를 가진 모든 파일 복사


112

유닉스에서는 모든 하위 디렉토리에서 특정 확장자 (모든 엑셀 파일)를 가진 모든 파일을 다른 디렉토리로 복사하고 싶습니다. 다음 명령이 있습니다.

cp --parents `find -name \*.xls*` /target_directory/

이 명령의 문제점은 다음과 같습니다.

  • 디렉토리 구조도 복사하고 파일 만 원하므로 모든 파일은 / target_directory /에 있어야합니다.

  • 파일 이름에 공백이있는 파일은 복사하지 않습니다.

이러한 문제에 대한 해결책이 있습니까?


어때 find... exec mv?
fedorqui 'SO stop harming'2013

답변:


174

--parents 디렉토리 구조를 복사하는 것이므로 제거해야합니다.

작성한 방식, find실행 및 출력은 cp파일 이름을 구분하는 공백과 파일 이름 내의 공백을 구분할 수 없도록 명령 줄에 입력 됩니다. 다음과 같은 것을하는 것이 좋습니다.

$ find . -name \*.xls -exec cp {} newDir \;

있는 cp각각의 파일 이름을 그 것은 실행 find발견을 올바르게 파일 이름을 통과시켰다. 자세한 정보는 다음과 같습니다.이 기술에 대한 는 .

위의 모든 것 대신 zsh를 사용 하고 간단히 입력 할 수 있습니다.

$ cp **/*.xls target_directory

zsh 하위 디렉터리를 포함하도록 와일드 카드를 확장 할 수 있으며 이러한 작업을 매우 쉽게 수행 할 수 있습니다.


2
예. 'bin it'은 버리는 것을 의미합니다. 현재 수정 :-)
Brian Agnew

13
Bash4.0 이상하고 ksh93도 지원합니다 **. bash의 경우을 사용 shopt -s globstar하여 활성화하십시오. ksh의 경우 set -G또는 set -o globstar.
pynexj 2013 년

2
@Daryl-나는 더 많이 채웠다. 그러나 대답은 이미 '수용'노트로 표시되었다
브라이언 애그뉴

5
이 exec는 xargs로 전달하는 것보다 기술적으로 덜 효율적입니다. 가능한 한 적은 수의 cp 호출로 모든 작업을 수행합니다. find . -name '*.xls' -print0 | xargs -0 cp -t destdir
Taywee

2
@BrianAgnew 오, 멍청한 Google 직원을위한 댓글에 추가 정보가있어 기쁩니다.
Taywee

37

위의 모든 것에서이 버전을 생각해 냈습니다. 이 버전은 Mac 복구 터미널에서도 작동합니다.

find ./ -name '*.xsl' -exec cp -prv '{}' '/path/to/targetDir/' ';'

현재 디렉토리와 모든 하위 디렉토리에서 xsl 확장자를 가진 파일을 재귀 적으로 찾습니다. 모두 대상 디렉토리에 복사됩니다.

cp 플래그는 다음과 같습니다.

  • p-파일의 속성 유지
  • r-재귀
  • v-verbose (복사되는 내용을 보여줍니다)

1
이것은 SSH가 Bluehost에 들어갈 때해야했던 것과 같습니다.
Plummer

4
하위 디렉토리를 보존하지 않습니다.
b005t3r

3
@ b005t3r은 의도적으로 설계된 것이 아닙니다. 그것이 OP의 질문의 전체 의도였습니다. 그는 서브 디렉토리의 모든 파일을 하위 디렉토리없이 하나의 디렉토리에 복사 원
Madivad

2
하위 디렉토리를 보존하기 위해 이것을 수정하는 방법이 있습니까?
Matthew Dean

8

비슷한 문제가있었습니다. 다음을 사용하여 해결했습니다.

find dir_name '*.mp3' -exec cp -vuni '{}' "../dest_dir" ";"

'{}'";"각 파일의 복사본을 실행합니다.


3

나도 직접해야했다. cp에 대한 --parents 인수를 통해 수행했습니다.

find SOURCEPATH -name filename*.txt -exec cp --parents {} DESTPATH \;

1
find [SOURCEPATH] -type f -name '[PATTERN]' | 
    while read P; do cp --parents "$P" [DEST]; done

--parents를 제거 할 수 있지만 여러 파일이 동일한 이름을 갖는 경우 충돌 위험이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.