我有许多不同名称且长度不同的文件。这些文件的扩展名是 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
如上例所示。