
디렉토리에 있는 5개의 이미지를 모두 가져와 5개의 이미지 그룹마다 고유한 파일 이름을 사용하여 새 파일로 병합하고 싶습니다.
find *.jpg | xargs -n 5 -i convert {} -append {#}.png
정말 가깝지만 {#}은 현재 줄 번호를 출력하지 않습니다. xargs로 이것이 가능합니까?
답변1
파일 이름에 공백이 포함되지 않은 경우:
시험 실행:
find *.jpg | xargs -n 5 | awk '{OFS=" ";}{print "convert",$1,$2,$3,$4,$5,"-append",NR".png\n";}'
문제가 없으면 첨부해 주세요 | sh
.
답변2
그리고 zsh
:
set -- ./**/*.jpg(N.)
n=0
while (($# >= 5)) {
convert $@[1,5] -append $((++n)).png
shift 5
}
파일은 파일 이름의 모든 문자에 대해 작동해야 하며 파일 목록이 정렬됩니다. 숨겨진 파일과 디렉터리는 무시됩니다.
답변3
이렇게 해주셔서 정말 기뻐요 parallel
. 여전히 xargs를 사용하려면 echo
xargs 명령에 an을 추가하여 명령을 인쇄한 다음 awk를 사용하여 출력을 사후 처리하여 마지막 단어를 적절한 카운트 파일 이름으로 바꿀 수 있습니다(더 쉬운 나열을 위해 앞에 0을 사용). :
find . -name '*.jpg' | xargs -n 5 -i echo convert {} -append {#}.png |
awk '{ $NF = sprintf("%04d.png", i); i++; print }' |
bash
(운이 좋다. 내 xargs에서는 -i와 -n을 혼합하는 것을 허용하지 않는다). 파일 이름에 공백이 있으면 작동하지 않습니다. 제가 사용하는 상황 find . -name
은 파일이 너무 많고 *.jpg
확장하기에는 너무 큰 경우입니다. ( -maxdepth 1
하위 디렉토리로 이동하고 싶지 않다면 추가하세요).
따라서 모든 작업을 awk로 수행하는 것이 더 간단할 수도 있습니다.
find . -maxdepth 1 -name '*.jpg' |
awk '{ files = files " " $1 }
NR%5 == 0 { printf("convert %s -append %04d.png\n",files,i); i++; files="" }
END { if(files!="")printf("convert %s -append %04d.png\n",files,i) } ' |
bash
이 END
섹션에서는 마지막 파일이 5의 배수가 아닌 경우를 처리합니다.