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

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

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

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

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

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

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



답변

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

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

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

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

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

$ cp **/*.xls target_directory

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


답변

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

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

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

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

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

답변

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

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

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


답변

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

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


답변

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

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


답변