2

我正在寻找一种将具有间隙的图像文件列表重命名为连续的方法。另外我想给他们一个 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

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

干杯

4

3 回答 3

1

这是蟒蛇

#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=...)就地排序,但我认为这会稍微冗长和可读......

于 2012-11-08T00:21:55.493 回答
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/并且是rename许多发行版上的默认命令。

当命令也被测试时,您可以移除-n开关来真正执行它。

于 2012-11-08T00:22:58.140 回答
0

等等等等等等。CSH 不好。巴什很好。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 ++

这不像我的例子很难阅读。

更正:也许您的意思是自动提取当前目录名称并将其合并。例如:

echo mv $FILE `echo $cwd | sed -e 's|^/||' -e 's|/|_|g'`.`printf %04d $i`.png ; @ i ++

-

tcsh 中不存在 glob 吗?您对 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为我做换行符。它有什么可怕的?

于 2012-11-08T02:01:54.560 回答