Perl 대체를 사용하여 파일 이름을 바꾸어 정렬

Perl 대체를 사용하여 파일 이름을 바꾸어 정렬

다음과 같은 파일 세트가 있습니다

fine_0.vtu
fine_10.vtu
fine_4032.vtu
...

정렬하고 렌더링할 수 있도록 패딩 0을 추가하고 싶습니다.

이 명령을 시도하고 있습니다

rename -n 's/fine_(\d+).vtu/sprintf("%05d", $1)/e' fine*.vtu

하지만 아무것도 표시되지 않습니다. 새 이름을 확인하고 적용하려면 명령을 어떻게 수정해야 합니까?

답변1

rename실제로 어떤 버전을 사용하고 있는지에 따라 다릅니다. 내 버전에서는 다음과 같이 보고합니다.

rename
Usage: rename [-v] [-n] [-f] perlexpr [filenames]

하지만 참고하세요.기본 rename명령많은 시스템에서 패키지의 버전은 하나 util-linux가 아닙니다 perl.

그러나 (때때로 호출되는) 버전이 있다고 가정하면 perl다음은 실제 예제입니다.renameprename

$ touch  fine_{0..99}.vtu

$ ls
fine_0.vtu   fine_24.vtu  fine_4.vtu   fine_55.vtu  fine_70.vtu fine_86.vtu
fine_1.vtu   fine_25.vtu  fine_40.vtu  fine_56.vtu  fine_71.vtu  fine_87.vtu
fine_10.vtu  fine_26.vtu  fine_41.vtu  fine_57.vtu  fine_72.vtu  fine_88.vtu
...          ...          ...          ...          ...

$ rename -n 's/^(.*_)(\d+)(\..*)/sprintf "%s%05d%s", $1, $2, $3/e' fine*
fine_0.vtu renamed as fine_00000.vtu
fine_1.vtu renamed as fine_00001.vtu
fine_10.vtu renamed as fine_00010.vtu
fine_11.vtu renamed as fine_00011.vtu
...

$ rm fine_{0..99}.vtu    # or: rm fine_?????.vtu

도구가 선택한 파일에 영향을 미칠 수 있도록 -n하려면 이를 제거하거나 교체해야 합니다 .-v

결국, 해당 버전이 없으면 [p]rename해당 버전을 다시 구현할 수 있습니다.perl

perl -MFile::Copy -e '
    foreach $f (@ARGV) {
        ($t = $f) =~ s/^(.*_)(\d+)(\..*)/sprintf "%s%05d%s", $1, $2, $3/e;
        warn sprintf("%s -> %s\n", $f, $t);
        move($f, $t);
    }
' fine_*

답변2

로 변경 zsh:

autoload -Uz zmv

zmv기능을 자동으로 로드합니다(가급적 ~/.zshrc).

그 다음에:

zmv -n '(fine_)(<->)(.vtu)' '$1${(l[5][0])2}$3'

( -n시운전용).

관련 정보