2016-06-16 5 views

답변

3

당신은 패턴의 확장을 루프를 사용할 수 있습니다

for img in */*.jpg ; do 
    convert -resize 50% "$img" "${img%.jpg}"_50.jpg 
done 

${variable%pattern}은 $ 변수의 오른쪽에서 패턴을 제거합니다.

+0

고마워요! 이것은 내가 찾고 있었던 것이지만, 패턴 확장을 제대로 할 수는 없습니다. 마지막 문장에서 당신의 설명이 나를 도왔고, 내가 뭘 잘못하고 있는지 이해했습니다. –

+0

에만 하위 디렉토리에있는 파일을 찾아 내고, 한 레벨 만 깊이 - 또는 여기 설정에 약간의'shopt'를 놓친 거지? –

+0

'shopt -s globstar; **/*. jpg의 img는 나를 위해 작동합니다. –

0

또한 LS + AWK를 사용하여이 (덜 우아) 한 줄을 시도 할 수 있습니다 :

ls *.jpg | awk -F '.' '{print "convert -resize 50% "$0" "$1"_50.jpg"}' | sh 

이 모든 .JPG 파일이 현재 디렉토리에 있다고 가정합니다. 이 프로그램을 실행하기 전에 | sh을 제거하고 화면에 무엇이 인쇄되어 있는지 확인하십시오.

1

당신은 find -exec을 사용할 수 있습니다 : 그것은 {}을 사용하여 참조 할 수있는

find -type f -name '*.jpg' -exec \ 
bash -c 'convert -resize 50% "$0" "${0%.jpg}"_50.jpg' {} \; 

find -type f -name '*.jpg'-exec 후 명령에 모든 .jpg (하위 디렉토리 포함) 파일과 손을 찾습니다.

매개 변수 확장을 사용하므로 -exec convert -resize을 직접 사용할 수 없습니다. 우리는 bash -c으로 전화를 걸어 {}을 위치 매개 변수로 제공해야합니다 (명령 내에 $0). \;-exec 명령의 끝을 표시합니다.

+0

한 빠른 질문 : 그것은 재귀, 새로 생성 된 파일은 수'.jpg' 것입니다 원인이됩니까? 'find'는 전체 목록을 먼저 버퍼링합니까, 아니면 일괄 적으로 파일을 찾습니까? 그것은 나를 위해 ~ 200의 파일 개수와 함께 작동하는 것 같다. – anishsane

+0

그것은하지 않는 것,하지만 난 정확한 동작을 확인하기 위해 당신에게 견적을 표시하기 위해 문서에 파고해야 할 것 @anishsane. –

관련 문제