문제

가장 좋은 방법은 무엇을 사용하여,Bash,하는 파일의 이름 바꾸기에서 형태로 되어 있습니다.

(foo1, foo2, ..., foo1300, ..., fooN)

제로 패딩 파일 이름:

(foo00001, foo00002, ..., foo01300, ..., fooN)
도움이 되었습니까?

해결책

는 경우 N 철정:

 for f in foo[0-9]*; do mv $f `printf foo%05d ${f#foo}`; done

다른 팁

그것은 순수하지 않 강타하지만,훨씬 쉽 rename 명령:

rename 's/\d+/sprintf("%05d",$&)/e' foo*

나는 더 복잡한 경우 파일 이름을 했다는 후위뿐만 아니라 접두사입니다.나가도 수행하는 데 필요한 빼기에서 파일명을 사용할 수 있다.

예를 들어,원 foo56.pngfoo00000055.png.

도움이 되기를 바랍니다면 당신이 뭔가를 더 복잡합니다.

#!/bin/bash

prefix="foo"
postfix=".png"
targetDir="../newframes"
paddingLength=8

for file in ${prefix}[0-9]*${postfix}; do
  # strip the prefix off the file name
  postfile=${file#$prefix}
  # strip the postfix off the file name
  number=${postfile%$postfix}
  # subtract 1 from the resulting number
  i=$((number-1))
  # copy to a new name with padded zeros in a new folder
  cp ${file} "$targetDir"/$(printf $prefix%0${paddingLength}d$postfix $i)
done

이 oneline 명령을 사용하는 이:

ls * | cat -n | while read i f; do mv "$f" `printf "PATTERN" "$i"`; done

패턴을 가지고 있다는 사실 예를 들어:

  • 이름 바꾸기와 증가 카운터: %04d.${f#*.} (원본 파일 확장자)
  • 이름 바꾸기와 증가 카운터 접두사: photo_%04d.${f#*.} (원본 확장자)
  • 이름 바꾸기와 증가 카운터의 변경 및 확장자를 jpg: %04d.jpg
  • 이름 바꾸기와 증가 카운터 접두사하고 파일 basename: photo_$(basename $f .${f#*.})_%04d.${f#*.}
  • ...

필터링할 수 있습니다 이 파일의 이름을 변경한 ls *.jpg | ...

당신이 사용할 수있는 변수 f 는 파일 이름과 i 는 카운터입니다.

당신의 질문에 대한 바른 명령은 다음과 같습니다.

ls * | cat -n | while read i f; do mv "$f" `printf "foo%d05" "$i"`; done

순수한 Bash,외부 프로세스를 다른 것보다'뮤직비디오':

for file in foo*; do
  newnumber='00000'${file#foo}      # get number, pack with zeros
  newnumber=${newnumber:(-5)}       # the last five characters
  mv $file foo$newnumber            # rename
done

다음 그것을 할 것입니다:

for ((i=1; i<=N; i++)) ; do mv foo$i `printf foo%05d $i` ; done

편집: 을 사용하도록 변경((i=1,...)),감사 mweerden!

여기에 빠른 해결책이라고 가정하는 고정 길이 접두사(의"foo")및 고정 길이 편리합니다.필요하신 경우 더 많은 유연성,어쩌면 이것은 적어도 도움이 되는 출발점입니다.

#!/bin/bash

# some test data
files="foo1
foo2
foo100
foo200
foo9999"

for f in $files; do
    prefix=`echo "$f" | cut -c 1-3`        # chars 1-3 = "foo"
    number=`echo "$f" | cut -c 4-`         # chars 4-end = the number
    printf "%s%04d\n" "$prefix" "$number"
done

나의 솔루션을 대체 번호 어디에서나 문자열

for f in * ; do
    number=`echo $f | sed 's/[^0-9]*//g'`
    padded=`printf "%04d" $number`
    echo $f | sed "s/${number}/${padded}/";
done

당신은 쉽게 시험할 수 있다 그것은 이후,그것은 단지 인쇄 변환 파일 이름(없이 파일시스템이 작업이 수행됩니다).

설명:

루프를 통해 파일 목록

루: for f in * ; do ;done, 목록 모든 파일과 전달을 각 파일 이름으로 $f 변수를 반복체.

을 잡는 번호로 문자열

echo $f | sed 우리는 관 변수 $f 하기 sed 프로그램입니다.

명령에 sed 's/[^0-9]*//g', 분 [^0-9]* 으로 수정 ^ 을 알려주는 경기대에서 숫자 0-9(숫자)다음을 제거 그것은 그것으로 빈 교체 //.왜 그냥 제거 [a-z]?기 때문에 파일이름이 포함될 수 있습 점,대시 등.그래서,우리는 스트립,모든지 않는 번호와 번호를 가져옵니다.

다음으로,우리는 할당하는 결과 number 변수가 있습니다.기억을 넣지 않은 공간에 할당,다음과 같 number = …, 기 때문에,당신이 얻는 다른 행동을 하도록 합니다.

우리는 할당을 실행 결과의 명령을 변수,포장 명령을 백틱 기호`.

로 패딩

명령 printf "%04d" $number 변화 형식의 번호는 4 자리 숫자 추가 제로하는 경우 우리의 번호를 포함 이하 4 자리 숫자가 있습니다.

대체 수로 패딩 번호

우리가 사용하는 sed 으로 다시 보충 다음과 같은 명령을 입력하십시오 s/substring/replacement/.해석하는 변수는,우리는 큰따옴표를 사용 및 대체 우리의 변수에 이 방법 ${number}.


위의 스크립트 출력만 변형 이름은,그래서,하자의 실제 이름을 바꾸는 일:

for f in *.js ; do
    number=`echo $f | sed 's/[^0-9]*//g'`
    padded=`printf "%04d" $number`
    new_name=`echo $f | sed "s/${number}/${padded}/"`
    mv $f $new_name;
done

희망이 누군가가 도움이 됩니다.

나는 몇 시간을 보냈을 그림이다.

왼쪽 패드 번호에서 파일 이름:

$ ls -l
total 0
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:24 010
-rw-r--r-- 1 victoria victoria 0 Mar 28 18:09 050
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:23 050.zzz
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:24 10
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:23 1.zzz

$ for f in [0-9]*.[a-z]*; do tmp=`echo $f | awk -F. '{printf "%04d.%s\n", $1, $2}'`; mv "$f" "$tmp"; done;

$ ls -l
total 0
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:23 0001.zzz
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:23 0050.zzz
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:24 010
-rw-r--r-- 1 victoria victoria 0 Mar 28 18:09 050
-rw-r--r-- 1 victoria victoria 0 Mar 28 17:24 10

설명

for f in [0-9]*.[a-z]*; do tmp=`echo $f | \
awk -F. '{printf "%04d.%s\n", $1, $2}'`; mv "$f" "$tmp"; done;
  • 참고 backticks: `echo ... $2}\` (백슬래시,\,바로 위에 그냥 나누는 한-라이너 이상 두 줄을 읽기 쉽도록)
  • 루프에서는 파일을 찾는라는 이름으로 숫자와 소문자로 알파벳 확장자: [0-9]*.[a-z]*
  • echo 는 파일이름($f 용)전달 awk
  • -F. : awk 필드 구분자,기간(.):일치하는 경우,분리하는 파일의 이름으로 두 개의 필드($1 number; $2 =장)
  • 형식 printf:인쇄 첫번째 필드($1, 수는 부분)으로 4 자리 숫자(%04d음),인쇄 기간,인쇄한 다음 두 번째 필드($2:확장)문자열로(%s).의 모든 것에 할당 $tmp 변수
  • 마지막으로,이동 소스 파일($f 는)새로운 파일이름($tmp)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top