이름 바꾸기 명령의 예를 여러 번 시도했지만 원하는 작업을 수행하는 구문을 알 수 없습니다.
다음과 같은 라벨이 붙은 파일이 많이 있습니다.
File_Ex_1.jpg
File_Ex_2.jpg
File_Ex_3.jpg
File_Ex_4.jpg
...
File_Ex_10.jpg
File_Ex_11.jpg
etc.
0
파일 이름의 문자 수가 동일하도록 삽입하여 일부를 변경하고 싶습니다 .
그래서 File_Ex_1.jpg
가고 싶어 File_Ex_01.jpg
, File_Ex_2.jpg
가File_Ex_02.jpg
이 작업을 수행하려면 이름 바꾸기 명령을 어떻게 사용할 수 있습니까?
이것rename
주문하다통해 설치됩니다스스로 만든맥에서. 출력 rename -v
:
rename -v
Usage:
rename [switches|transforms] [files]
Switches:
-0/--null (when reading from STDIN)
-f/--force or -i/--interactive (proceed or prompt when overwriting)
Wide character in print at /System/Library/Perl/5.18/Pod/Text.pm line 286.
-g/--glob (expand "*" etc. in filenames, useful in Windows™ CMD.EXE)
-k/--backwards/--reverse-order
-l/--symlink or -L/--hardlink
-M/--use=*Module*
-n/--just-print/--dry-run
-N/--counter-format
-p/--mkpath/--make-dirs
--stdin/--no-stdin
-t/--sort-time
-T/--transcode=*encoding*
-v/--verbose
Transforms, applied sequentially:
-a/--append=*str*
-A/--prepend=*str*
-c/--lower-case
-C/--upper-case
-d/--delete=*str*
-D/--delete-all=*str*
-e/--expr=*code*
-P/--pipe=*cmd*
-s/--subst *from* *to*
-S/--subst-all *from* *to*
-x/--remove-extension
-X/--keep-extension
-z/--sanitize
--camelcase --urlesc --nows --rews --noctrl --nometa --trim (see manual)
답변1
이것을 사용해 보세요:
rename -e 's/\d+/sprintf("%02d",$&)/e' -- *.jpg
예:
$ ls
Device_Ex_10.jpg Device_Ex_1.jpg Device_Ex_4.jpg Device_Ex_7.jpg
Device_Ex_11.jpg Device_Ex_2.jpg Device_Ex_5.jpg Device_Ex_8.jpg
Device_Ex_12.jpg Device_Ex_3.jpg Device_Ex_6.jpg Device_Ex_9.jpg
$ rename -e 's/\d+/sprintf("%02d",$&)/e' -- *.jpg
$ ls
Device_Ex_01.jpg Device_Ex_04.jpg Device_Ex_07.jpg Device_Ex_10.jpg
Device_Ex_02.jpg Device_Ex_05.jpg Device_Ex_08.jpg Device_Ex_11.jpg
Device_Ex_03.jpg Device_Ex_06.jpg Device_Ex_09.jpg Device_Ex_12.jpg
나는 여기에서 참조를 가져 왔습니다. https://stackoverflow.com/questions/5417979/batch-rename-series-files-by-padding-with-zeroes
여기서는 특정 rename
구현에 맞게 조정하세요.
답변2
사용 중인 것으로 보이는 이름 바꾸기 버전을 사용하여 다음 표현식은 요청한 변환을 수행해야 합니다(라는 이름의 파일이 포함된 디렉터리의 예 File_Ex_{1..11}.jpg
).
$ rename -n -e 's/_(\d\.)/_0$1/g' -- *.jpg
'File_Ex_1.jpg' would be renamed to 'File_Ex_01.jpg'
'File_Ex_2.jpg' would be renamed to 'File_Ex_02.jpg'
'File_Ex_3.jpg' would be renamed to 'File_Ex_03.jpg'
'File_Ex_4.jpg' would be renamed to 'File_Ex_04.jpg'
'File_Ex_5.jpg' would be renamed to 'File_Ex_05.jpg'
'File_Ex_6.jpg' would be renamed to 'File_Ex_06.jpg'
'File_Ex_7.jpg' would be renamed to 'File_Ex_07.jpg'
'File_Ex_8.jpg' would be renamed to 'File_Ex_08.jpg'
'File_Ex_9.jpg' would be renamed to 'File_Ex_09.jpg'
-n
( 실제로 이름 바꾸기를 수행하려면 플래그를 제거하십시오 .)
인수는 -e
Perl 검색 및 교체 표현식입니다. 이는
_(\d\.)
am 밑줄과 일치하고 숫자, 점이 뒤따르고 밑줄을 로 대체하여 _0
앞에 0을 삽입합니다. $1
괄호로 묶인 그룹(숫자 및 점)에 대한 역참조이며 새 파일 이름에서는 변경되지 않습니다.
답변3
명령을 통해 수행할 수 있지만 prename
Python 대안을 제공하고 싶습니다.
$ ls
File_Ex_1.jpg File_Ex_2.jpg File_Ex_3.jpg File_Ex_4.jpg
$ ./pad_zeros.py *
$ ls
File_Ex_01.jpg File_Ex_02.jpg File_Ex_03.jpg File_Ex_04.jpg pad_zeros.py*
스크립트는 pad_zeros.py
간단합니다.
#!/usr/bin/env python
import sys,os,re
for file in sys.argv[1:]:
if __file__ in file: continue
words = re.split('_|\.',file)
words[-2] = words[-2].zfill(2)
new_name = "_".join(words[:-1]) + "." + words[-1]
os.rename(file,new_name)
명령줄에서 인수를 가져와 반복하고 .zfill()
명령을 사용하여 인수를 0(이 경우 두 문자)으로 채웁니다. 동일한 폴더의 모든 파일을 작업하고 있으므로 glob-star를 사용할 수 있습니다.
답변4
위의 답변 중 하나는 다음과 같습니다.
rename -e 's/\d+/sprintf("%02d",$&)/e' -- *.jpg
그러나 *.jpg 파일은 엄격한 숫자 순서로 정렬되기 때문에 이는 잘못된 결과를 제공합니다. rename
깃발을 들고 리허설을 진행하면 -n
다음과 같은 결과가 나옵니다.
rename(9999.jpg, frames_0000039996.jpg)
rename(999.jpg, frames_0000039997.jpg)
rename(99.jpg, frames_0000039998.jpg)
rename(9.jpg, frames_0000039999.jpg)
올바른 결과는 다음을 통해 얻을 수 있습니다.
rename 's/.+/our $i; sprintf("frames_%010d.jpg", 0+$i++)/e' $(ls -1 | sort -V)
이것은 만든다
rename(9999.jpg, frames_0000039996.jpg)
rename(999.jpg, frames_0000039997.jpg)
rename(99.jpg, frames_0000039998.jpg)
rename(9.jpg, frames_0000039999.jpg)
플래그 와 함께 -n
.