Find 및 Mv를 사용하여 스크립트를 단순화하기 위해 이름 바꾸기 유틸리티를 사용할 수 있습니까?

Find 및 Mv를 사용하여 스크립트를 단순화하기 위해 이름 바꾸기 유틸리티를 사용할 수 있습니까?

특정 순서에 따라 파일 이름을 자동으로 바꾸는 스크립트를 사용합니다.

#!/usr/bin/env zsh

pages=($(sed -n '/page_order/,/^$/ p' _config.yml | tail -n +2 | sed 's/ - //'))
npages=${#pages}
for ((i=1; i<=$npages; i++)); do
  page=${pages[$i]}
  old=${(f)$(gfind . -iregex ".*/.*${page}.md")[1]}
  pagenumber=$(printf '%0*d\n' ${#npages} $i)
  new="${pagenumber}-${page}.md"
  mv -i $old $new
done

_config.yml항목은 어디에 있나요?

page_order:
 - foo
 - bar
 - baz

파일 foo.md bar.md baz.md이름은 자동으로 1-foo.md 2-bar.m 3-baz.md.

rename이 유틸리티를 사용하여 이 프로세스를 단순화할 수 있는 방법이 있습니까 ? 저는 맥 OS X 10.10을 사용하고 있습니다.

(순수한 zsh 솔루션에 대해서는 다음을 참조하세요.여기서 `find`를 사용하는 대신 Zsh에 내장된 와일드카드 일치를 사용할 수 있나요?)

답변1

당신이 목록을 얻을 수 있다면문서rename이는 Perl의 매개변수 세트로 쉽게 수행할 수 있습니다.

rename 'no warnings; $a++; s!^(.*/)?(.*)!$1$a-$2!' "$@"

변수 $a$b는 Perl에서 미리 선언된 전역 변수이므로 전체 표현식이 루프 내에서 고려되어야 하고 그에 따라 범위가 지정되어야 하지만 실행 기간 동안 해당 값을 유지합니다. 대체 자체는 현재 값을 $a파일 이름의 일부로 삽입하므로 인수도 경로 이름이 될 수 있습니다. (매개변수를 dirnamesums 로 분할하여 basename$1 및 $2 구성요소가 생성됩니다.)

pragma no warnings는 교체를 중지하고 경로 이름 구성 요소가 누락되었다고 불평합니다. 일반적으로 이는 필수는 아니지만 이 rename명령을 사용하면 추가 경고가 가능하다고 생각합니다.

-n시운전에 추가하거나 -v사후 확인 작업에 추가합니다.

또는 Perl 조각을 사용하여 얻은 매개변수를 가져와서 파일 세트에 적용할 수 있습니다. 하지만 일단 그렇게 하고 나면 Perl에서 YAML을 구문 분석할 수도 있습니다.

관련 정보