bash 스크립트에서 아래 명령과 비슷한 명령을 실행하려고합니다. 모든 하위 폴더를 검색 $sourcedir
하고 특정 유형의 모든 파일을 루트 수준으로 복사해야합니다 $targetdir
.
#!/bin/bash
# These are set as arguments to the script, not hard-coded
sourcedir="/path/to/sourcedir"
targetdir="/path/to/targetdir"
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2/`basename "$1"`"' "{}" "$targetdir" \;
즉 제외하고 이것은 아주 가까이 보인다 {}
으로 전달되지 않는 $2
에-exec sh -c ...
파일 이름의 특수 문자 (특히 작은 따옴표 문자)를 허용하여 가능한 한 "올바른 방법"에 가깝게 작업하고 싶습니다.
편집 : 사람들이 사용 xargs
하거나 인수 체인을 제안하는 것을 봅니다 . 나는 이것이 제한된 수의 주장에 대해서만 괜찮다는 인상을 받았다. 예를 들어 수천 개의 .jpg 파일을 여러 갤러리 디렉토리에서 거대한 슬라이드 쇼 디렉토리로 복사하려고하면 솔루션 체인 인수가 여전히 작동합니까?
편집 2 : 내 문제는 명령 _
에서 sh 할 첫 번째 옵션 이전 에 누락되었다는 것 -exec
입니다. find 명령을 작동시키는 방법에 대해 궁금한 사람은 다음을 추가하십시오 _
.
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2"' _ "{}" "$targetdir" \;
동일한 작업을 수행하지만보다 효율적이고 우아하기 때문에 아래 답변을 수락했습니다.
xargs
한계가있는 일반 명령에서 많은 양의 인수를 자동으로 처리하기 위해 작성된 이유 입니다. 또한 고려할 수있는 대부분의 최대 인수 제한은 표준 GNU 유틸리티에 대해 크게 개선되었습니다. 또한 수천 개의 파일과 관련된 프로세스 포크를 피하면서 성능상의 이점을 볼 수 있습니다.