在 posix 目录循环中修改文件名安全吗?

问题描述 投票:0回答:1

例如有一个目录有20个文件。

# mkdir test
# touch test/{11..30}
# ls test
11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30

还有一个简单的循环来重命名文件。它在每个文件名前面添加一个数字 9。

#!/bin/sh

dir='/tmp/test'

for fullpath in "$dir"/* ; do
    filename=${fullpath##*/}
    mv "$fullpath" "${dir}/9${filename}"
done

然后运行脚本。

# ./prog.sh
# ls test
911  912  913  914  915  916  917  918  919  920  921  922  923  924  925  926  927  928  929  930

在此测试中,修改文件名是安全的。

但是,如果目录中有更多文件(或者存在递归目录),前几个重命名(即 911、912、913...)可能会被排序到列表的末尾。然后它们可能会再次被送入循环,这使得它成为无限循环,不断添加前缀数字 9?

我想这取决于通配符的特性。如果有最大数量的物品可以携带。如果超过最大值,是否会延迟扩容。

在 posix 目录循环中修改文件名总是安全的吗?

directory posix glob file-rename batch-rename
1个回答
0
投票
问题的关键在于全球化是否继续以“流”方式扩张。如果确实如此,是的,如果循环内的命令创建 glob 也可以读取的文件,那么您可能会陷入无限循环。

但是,

globbing 会扩展一次 到由 for

 循环重复使用的列表中。根据
POSIX规范in
后面的“单词列表”被扩展以生成项目列表。

for name [ in [word ... ]] do compound-list done
这个:

for name in ./* ; do ...
相当于这个(如果“11,12,13”是通配模式找到的文件):

for name in "11" "12" "13" ; do ...

For

 循环迭代列表,而不是通配模式。在正常操作期间,通配模式恰好在 
for
 循环到达列表之前计算为列表。

© www.soinside.com 2019 - 2024. All rights reserved.