我正在寻找一种方法来重命名具有间隙的图像文件列表。另外我想给它们填充4.我目前正在使用Python 2.7和Linux bash来编程。
Example:
1.png
2.png
3.png
20.png
21.png
50.png
应该变成:
0001.png
0002.png
0003.png
0004.png
0005.png
0006.png
我还希望文件名与它们当前所在的目录相同。
Example:
c_users_johnny_desktop_images.0001.png
c_users_johnny_desktop_images.0002.png
c_users_johnny_desktop_images.0003.png
c_users_johnny_desktop_images.0004.png
c_users_johnny_desktop_images.0005.png
c_users_johnny_desktop_images.0006.png
任何帮助将不胜感激! :)
干杯
答案 0 :(得分:1)
这是python
#first collect all files that start with a number and end with .png
my_files = [f for f in os.listdir(some_directory) if f[0].isdigit() and f.endswith(".png")]
#sort them based on the number
sorted_files = sorted(my_files,key=lambda x:int(x.split(".")[0])) # sort the file names by starting number
#rename them sequentially
for i,fn in enumerate(sorted_files,1): #thanks wim
os.rename(sorted_files[i],"{0:04d}.png".format(i))
我可以使用list.sort(key=...)
进行排序,但我认为这会稍微冗长和可读......
答案 1 :(得分:1)
在shell中尝试执行此操作:
rename -n '
$s = substr(join("_", split("/", $ENV{PWD})), 1) . ".";
s/(\d+)\.png/$s . sprintf("%04d", ++$c) . ".png"/e
' *.png
输出:
1.png -> c_users_johnny_desktop_images.0001.png
2.png -> c_users_johnny_desktop_images.0002.png
3.png -> c_users_johnny_desktop_images.0003.png
20.png -> c_users_johnny_desktop_images.0004.png
21.png -> c_users_johnny_desktop_images.0005.png
50.png -> c_users_johnny_desktop_images.0006.png
rename
是http://search.cpan.org/~pederst/rename/,是许多发行版上的defalut rename
命令。
当测试命令时,您可以删除-n
开关以实现此目的。
答案 2 :(得分:0)
% set i = 1
% foreach FILE ( `ls *[0-9].png | sort -n` )
echo mv $FILE `printf %04d $i`.png ; @ i ++
end
输出:
mv 1.png 0001.png
mv 2.png 0002.png
mv 3.png 0003.png
mv 20.png 0004.png
mv 21.png 0005.png
mv 50.png 0006.png
回复评论:
仍然需要c_users_johnny_desktop_images。
好的,请使用:
echo mv $FILE c_users_johnny_desktop_images.`printf %04d $i`.png ; @ i ++
这不像我的例子难以阅读。
更正:也许您打算自动提取当前目录名称并将其合并。 E.g:
echo mv $FILE `echo $cwd | sed -e 's|^/||' -e 's|/|_|g'`.`printf %04d $i`.png ; @ i ++
-
是否在tcsh中不存在?你解析ls似乎很可怕
当然还有球。这就是我们传入 ls 的内容。但是,globbing为我们提供了一个按字母顺序排序的列表,如1,2,20,21,3,50。我们想要一个数字排序,如1,2,3,20,21,50。当我们在数字中没有前导零时的标准问题。
sort -n 进行数字排序。 ls 在每个文件名后面给我们一个换行符。我们可以轻松地写一下:
foreach FILE ( `echo *[0-9].png | tr ' ' '\012' | sort -n` )
但是我很懒, ls 为我做换行。有什么可怕的呢?