如何将目录中的文件名称更改为随机生成的名称?

如何将目录中的文件名称更改为随机生成的名称?

我有许多不同名称且长度不同的文件。这些文件的扩展名是 jpeg。

如何将文件的名称更改为随机生成的名称?

答案1

在包含以下文件的目录中运行:

for file in *.jpeg; do
    mv -- "$file" "$RANDOM.jpeg"
done

$RANDOM但由于只给出 0 到 32767 之间的数字,因此随机名称可能会发生冲突。

更好的解决方案,感谢潘宝华

for file in *.jpeg; do
    mv -- "$file" "$(mktemp --dry-run XXXXXXXX.jpeg)"
done

随机名称仍有可能发生冲突,但它明显较小,只有 8 个字母数字字符mktemp。请参阅Anselmo 的回答以保证不会发生冲突。

答案2

使用 RANDOM 是一种有限的方法。来自 BASH man:“RANDOM 每次引用此参数时,都会生成一个介于 0 到 32767 之间的随机整数。”所以... 文件数不能超过 32768 个!:)

另一个更大的问题是重复的可能性。您会看到,重复问题会影响随机生成器的任何使用,只是发生概率不同。

使用 mktemp 可能是一个更好的解决方案,但您一定不能使用 --dry-run 参数,因为这会生成名称,但不能保证不存在具有该名称的文件。这样使用它就只是一种随机生成器。

所以,我的简单建议是:

for file in *.jpeg; do
    new_file="$(mktemp XXXXXXXX.jpeg)"
    mv -f -- "$file" "$new_file"
done

一步步。

new_file="$(mktemp XXXXXXXX.jpeg)"

以这种方式运行 mktemp,它会安全地创建一个具有新随机名称的文件,并注意随机重复。它还会输出所创建文件的名称,我会将其捕获到 new_file 中。

mv -f -- "$file" "$new_file"

使用 -f 运行 mv 强制重命名图像以覆盖新文件。

答案3

您可以轻松地做到这一点,并且有很大的确定性,您不会通过$RANDOM如下方式获得具有相似名称的文件名:

for file in *.jpeg; do
    mv -- "$file" "$RANDOM-$RANDOM-$RANDOM.jpeg"
done

获得相同名称的可能性1/(32767)^3如上例所示。

相关内容