2013-05-05 4 views
1

파일 이름에 특정 문자열을 포함하는 모든 파일을 재귀 적으로 변환하고 싶습니다. 출력 파일 이름의 특정 문자열을 다른 문자열로 바꿔야합니다.사용하는 동안 파일 이름에 문자열 바꾸기

이미 첫 번째 부분이 있지만 출력 파일 이름에서 문자열을 바꿀 방법이 없습니다.

출력 파일에 입력 파일의 이름을 '-head-'와 다시 붙이면 '-default-'가 파일 이름에 포함되어야합니다. 당신의 도움에 대한

감사합니다 :)

find . -name '*-default-*' -print0 | xargs -0 -L 1 -I {} convert -compress JPEG -resize "238" {} {} 

답변

1

xargs 입력 파일 이름의 일부를 대체를위한 시설이 없지만, 그 해결하려면 충분히 쉽다. xargs에서 간단한 셸 스크립트를 실행하면 원하는대로 셸의 전체 레퍼토리를 얻을 수 있습니다.

find . -name '*-default-*' -print0 | 
xargs -0 -L 1 -I {} bash -c 'f="{}"; 
    convert -compress JPEG -resize 238 "$f" "${f/-default-/-head-}"' 

${var/str/subst} 구문은 bashism이고; POSIX 호환 쉘 스크립트가 필요한 경우 다소 복잡해야합니다.

예를 들어 까다로운 파일 이름이있는 경우 큰 따옴표를 사용하는 경우 독립 실행 형 스크립트를 사용해야 할 수도 있습니다. 아마 이런 식으로 뭔가 :

#!/bin/bash 
for f; do 
    convert -compress JPEG -resize 238 "$f" "${f/-default-/-head-}"' 
done 

은 그럼 그냥

+0

발견 된 파일 이름에 공백이나 아포스트로피가 포함되어 있으면이 기능이 작동하지 않습니다. – spbnick

+0

오른쪽; 부분 구제로 쌍 따옴표를 추가했지만 파일 이름에. 큰 따옴표. – tripleee

1

... | xargs ./script tripleee 노트로, xargs를가 대체 파일 이름을 조작 지원하지 않습니다 수 있습니다. 그러나 쉘 루프가이를 수행하고 이해하기가 쉽습니다. 이와 같이 :

find . -name '*-default-*' | 
    while IFS='' read -r f; do 
     convert -compress JPEG -resize 238 "$f" "${f/-default-/-head-}" 
    done 

빈 문자열을 IFS에 할당하면 앞뒤 공백이 손실되지 않습니다. "-r"스위치를 "read"로 설정하면 백 슬래시를 이스케이프 문자로 해석 할 수 없습니다. 3 인승이 지적한 bashism을 피하려면 sed를 사용하십시오.

관련 문제