名前変更コマンドの例を複数回試しましたが、目的の操作を実行する構文がわかりません。
次のようなラベル付きファイルがたくさんあります。
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
注文する経由でインストールされます自分で作ったMacで。出力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
前にゼロを挿入します。$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(この場合は2文字)で埋めます。同じフォルダ内のすべてのファイルを操作しているので、glob-starを使用できます。
答え4
上記の答えの1つは次のとおりです。
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
。