xargs에서 현재 행 번호를 얻는 방법은 무엇입니까?

xargs에서 현재 행 번호를 얻는 방법은 무엇입니까?

디렉토리에 있는 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를 사용하려면 echoxargs 명령에 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의 배수가 아닌 경우를 처리합니다.

관련 정보