[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를 제거 할 수 있지만 여러 파일이 동일한 이름을 갖는 경우 충돌 위험이 있습니다.