重命名具有间隙的顺序图像文件

时间:2012-11-08 00:14:35

标签: python linux bash

我正在寻找一种方法来重命名具有间隙的图像文件列表。另外我想给它们填充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

任何帮助将不胜感激! :)

干杯

3 个答案:

答案 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

renamehttp://search.cpan.org/~pederst/rename/,是许多发行版上的defalut rename命令。

当测试命令时,您可以删除-n开关以实现此目的。

答案 2 :(得分:0)

Blah Blah Blah。 CSH很糟糕。 BASH很好。 Python更好。呸骗子。我仍然使用TCSH ...

% 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 为我做换行。有什么可怕的呢?