按数字序列 + 字母重命名文件
Renaming files in a numerical sequence + letters
我有一个文件夹,其中包含 .png
个名为 image1.png, image2.png, image3.png
等的图像
这个文件夹的组织方式,3 个连续的图像代表来自同一主题的数据,所以我希望它们被命名为相同的标识号 + 一个字母以区分它们。像这样:
image1.png --> 1-a.png
image2.png --> 1-b.png
image3.png --> 1-c.png
image4.png --> 2-a.png
image5.png --> 2-b.png
image6.png --> 2-c.png
等等。
最好的方法是什么? Perl
脚本?或者在 python
中生成具有所需名称的 .txt
,然后使用它来重命名文件?我正在使用 Ubuntu
.
提前致谢!
给定 Python 中的文件列表 files
,您可以使用 itertools.product
生成所需的数字和字母对:
from itertools import product
import os
os.chdir(directory_containing_images)
# instead of hard-coding files you will actually want:
# files = os.listdir('.')
files = ['image1.png', 'image2.png', 'image3.png', 'image4.png', 'image5.png', 'image6.png']
for file, (n, a) in zip(files, product(range(1, len(files) // 3 + 2), 'abc')):
os.rename(file, '{}-{}.png'.format(n, a))
如果把os.rename
换成print
,上面的代码会输出:
image1.png 1-a.png
image2.png 1-b.png
image3.png 1-c.png
image4.png 2-a.png
image5.png 2-b.png
image6.png 2-c.png
在 perl
你可以做:
my @new_names = map {
my ( $n ) = $_ =~ /image(\d+)\.png/;
my $j = (($n - 1) % 3) + 1;
my $char = (qw(a b c))[ int( $n / 3 ) ];
"$j-$char.png"
} @files;
这假定 @files
数组没有特殊排序。
有趣的项目。 :)
declare -i ctr=1 fileset=1 # tracking numbers
declare -a tag=( c a b ) # lookup table
for f in $( printf "%s\n" *.png | # stack as lines
sort -k1.6n ) # order appropriately
do ref=$(( ctr++ % 3 )) # index the lookup
end=${f##*.} # keep the file ending
mv "$f" "$fileset-${tag[ref]}.$end" # mv old file to new name
(( ref )) || (( fileset++ )) # increment the *set*
done
mv image1.png 1-a.png
mv image2.png 1-b.png
mv image3.png 1-c.png
mv image4.png 2-a.png
mv image5.png 2-b.png
mv image6.png 2-c.png
mv image7.png 3-a.png
mv image8.png 3-b.png
mv image9.png 3-c.png
mv image10.png 4-a.png
mv image11.png 4-b.png
mv image12.png 4-c.png
显然,根据铺路和施工的需要进行编辑。
我在 python3 中尝试过这个,它根据您的需要工作。
import os
import string
os.chdir(path_to_your_folder)
no=1
count=1
alphabet = ['a','b','c']
count=0
for filename in os.listdir(os.getcwd()):
newfilename = (str(no) + "-" + alphabet[count]+".png")
os.rename(filename,newfilename)
count=(count+1)%3
if count==0:
no=no+1
我有一个文件夹,其中包含 .png
个名为 image1.png, image2.png, image3.png
等的图像
这个文件夹的组织方式,3 个连续的图像代表来自同一主题的数据,所以我希望它们被命名为相同的标识号 + 一个字母以区分它们。像这样:
image1.png --> 1-a.png
image2.png --> 1-b.png
image3.png --> 1-c.png
image4.png --> 2-a.png
image5.png --> 2-b.png
image6.png --> 2-c.png
等等。
最好的方法是什么? Perl
脚本?或者在 python
中生成具有所需名称的 .txt
,然后使用它来重命名文件?我正在使用 Ubuntu
.
提前致谢!
给定 Python 中的文件列表 files
,您可以使用 itertools.product
生成所需的数字和字母对:
from itertools import product
import os
os.chdir(directory_containing_images)
# instead of hard-coding files you will actually want:
# files = os.listdir('.')
files = ['image1.png', 'image2.png', 'image3.png', 'image4.png', 'image5.png', 'image6.png']
for file, (n, a) in zip(files, product(range(1, len(files) // 3 + 2), 'abc')):
os.rename(file, '{}-{}.png'.format(n, a))
如果把os.rename
换成print
,上面的代码会输出:
image1.png 1-a.png
image2.png 1-b.png
image3.png 1-c.png
image4.png 2-a.png
image5.png 2-b.png
image6.png 2-c.png
在 perl
你可以做:
my @new_names = map {
my ( $n ) = $_ =~ /image(\d+)\.png/;
my $j = (($n - 1) % 3) + 1;
my $char = (qw(a b c))[ int( $n / 3 ) ];
"$j-$char.png"
} @files;
这假定 @files
数组没有特殊排序。
有趣的项目。 :)
declare -i ctr=1 fileset=1 # tracking numbers
declare -a tag=( c a b ) # lookup table
for f in $( printf "%s\n" *.png | # stack as lines
sort -k1.6n ) # order appropriately
do ref=$(( ctr++ % 3 )) # index the lookup
end=${f##*.} # keep the file ending
mv "$f" "$fileset-${tag[ref]}.$end" # mv old file to new name
(( ref )) || (( fileset++ )) # increment the *set*
done
mv image1.png 1-a.png
mv image2.png 1-b.png
mv image3.png 1-c.png
mv image4.png 2-a.png
mv image5.png 2-b.png
mv image6.png 2-c.png
mv image7.png 3-a.png
mv image8.png 3-b.png
mv image9.png 3-c.png
mv image10.png 4-a.png
mv image11.png 4-b.png
mv image12.png 4-c.png
显然,根据铺路和施工的需要进行编辑。
我在 python3 中尝试过这个,它根据您的需要工作。
import os
import string
os.chdir(path_to_your_folder)
no=1
count=1
alphabet = ['a','b','c']
count=0
for filename in os.listdir(os.getcwd()):
newfilename = (str(no) + "-" + alphabet[count]+".png")
os.rename(filename,newfilename)
count=(count+1)%3
if count==0:
no=no+1