2013-10-16 5 views
1

이것은 리눅스 셸 스크립트가 처음 사용 된 시간이며 정말 강력하지만 여전히 약간 혼란 스럽습니다.특정 확장명을 가진 모든 파일을 반복하고 그들에게 무언가를 실행하십시오.

나는 이름은 같지만 서로 다른 확장자에 사용하여 새 파일을 생성하는 모든 디렉토리 반복적으로에서 특정 확장자를 가진 파일 (모든 하위 디렉토리, subsubdirectories 및 ...)을 통해 그들에 실행 파일을 실행하여 루프를 원하는 원본 파일의 정확한 위치. 다음

이에 대한 의사 코드입니다 :

files = list of all files (full path not just names) with extension .ext recursively 

for file in files 
    executable -option1 -option2 fullpath/file.ext1 > fullpath/file.ext2 

답변

6
find . -name '*.ext1' -type f -exec sh -c \ 
    'executable -option1 -option2 ${0} > ${0%.ext1}.ext2' {} \; 

find 재귀 적으로 파일 트리를 걷기위한 표준 도구입니다. 첫 번째 인수 (이 경우 '.'는 현재 작업 디렉토리를 의미 함)는 하강을 시작할 트리의 기준을 지정합니다. -name 인수는 검색 범위를 주어진 파일 이름과 일치하는 파일로 제한합니다. -type f은 검색을 일반 파일 (디렉토리 나 다른 엔티티가 아닌)로 제한합니다. -exec 옵션은 find가 이전 스펙 (".ext1"로 끝나는 일반 파일)과 일치하는 모든 파일에서 지정된 명령을 실행하도록 지시합니다. sh을 사용하여 두 가지 이유로 실행 파일을 직접 호출하지 않고 명령을 실행합니다. 파일 이름을 조작하기 쉽고 엄격하게 이식 할 수 없기 때문에 파일 이름을 find으로 조작하려고 시도하기 때문에 정확히 {}으로 지정해야합니다.

${0%.ext1}는 파일명 (우리가 발견에 {} 통해 sh의 첫번째 인수로 전달 이후 $0의 값이, 파일 이름이다) 소요 후단 ".ext1를"OFF 스트립 쉘 구문이다. 그 결과 문자열에 ".ext2"를 추가하여 원하는 출력 파일을 얻습니다.

4

bash 4 이상에서는 기본적으로 설정된 globstar 옵션을 이용할 수 있습니다.

for file in **/*.ext1; do 
    executable -option1 -option2 "$file" > "${file%.ext1}".ext2 
done 
+0

@chepner! – SIRBA

관련 문제