"convert"와 "xargs"를 함께 사용하는 방법은 무엇입니까?

"convert"와 "xargs"를 함께 사용하는 방법은 무엇입니까?

.rgb여러 파일을 s로 변환 해야 합니다 .png(각 파일은 원래 이름을 유지해야 함).

첫 번째 파일을 변환한 다음 명령을 "for" 루프로 래핑하는 방법을 알고 싶습니다.

이것이 내가 지금까지 가지고 있는 것입니다:

find . -name "*.rgb" | sort | sed -n \1\p | xargs convert zzzzz.png

그러나 이것은 작동하지 않습니다.

convert명령이 두 번째 인수를 인식하도록 하려면 어떻게 해야 합니까 zzzzz.png?

답변1

디렉토리 트리의 모든 파일을 변환하려면 다음을 실행합니다.

find . -name '*.rgb' | parallel convert {} {.}.png

이는 병렬로 실행됩니다.

convert ./foo.rgb ./foo.png
convert ./bar/quux.rgb ./bar/quux.png

여기서는 GNU Parallel을 사용하여 모든 CPU를 활용합니다. 시스템에 따라 패키지로 설치할 수 있습니다. 그렇지 않으면 여기에 있습니다.gnu.org/software/parallel. 데비안에서는 다음과 같습니다:

apt-get install parallel

편집 :
다음은 그렇지 않은 솔루션입니다 GNU Parallel.

find . -name '*.rgb' -exec sh -c 'convert "$0" "${0%.*}.png"' {} \;

그다지 좋지 않은 솔루션 사용 while..read:

find . -name '*.rgb' | while read FILE; do convert "${FILE}" "${FILE%rgb}png" ; done

답변2

내가 사용하는 단일 디렉토리의 모든 이미지를 변환(내 경우에는 크기 조정)하려면

ls *.jpg | xargs -I {} convert {} -resize 1024x768 resized/{}

파일 이름에 대한 중괄호 자리 표시자는 두 번 사용될 수 있습니다. 또한 이를 사용하여 대상 파일 이름에 접두사를 추가할 수도 있습니다.

재귀 검색의 경우:

find -name '*.jpg' | xargs -I {} convert {} -resize 1024x768 resized/{}

답변3

나는 답을 찾았습니다:

for i in 'seq 1 $numOfRGBfiles'; do
#Insert code here that finds the file
#name of each rgb file and stores it 
#in $filename.

'find . -name "*.rgb" | sort | sed -n 
\$i\p |  xargs -I {} convert {} 
\$filename.png'
done

관련 정보