문제
가장 좋은 방법은 무엇을 사용하여,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.png
가 foo00000055.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
)