任务是用随机 UUID/GUID 替换文件(实际上是目录中的所有文件)名称(但保持扩展名不变)。关于如何做到这一点有什么想法吗?
答案1
与 bahamat 答案类似,但生成实际的UUID。 UUID 有一些保留位,用于确定所使用的版本和变体。目前定义了 5 种类型的 UUID,正如您所问,随机 UUID 是版本 4。您会注意到版本 4 UUID 具有以下格式:
442b7f35-f33f-4b8d-9a07-db8ec207129e | '-- 变体(位 10__ -> [89AB]) '-------- 版本(位 0100 -> 4)
此外,如果 UUID 生成失败,此版本也不会造成损坏。
for i in *; do uuid=$(uuidgen -r) && mv -- "$i" "$uuid.${i##*.}"; done
对于 macOS
for i in *; do uuid=$(uuidgen) && mv -- "$i" "$uuid.${i##*.}"; done
使用/proc/sys/内核/随机/uuid:
for i in *; do uuid=$(cat /proc/sys/kernel/random/uuid) && mv -- "$i" "$uuid.${i##*.}" done
答案2
像这样的东西:
for i in *; do mv -- "$i" "$(openssl rand -hex 16).${i##*.}"; done
使用为openssl rand 16
您提供 128 位 GUID。如果您需要 256 位 GUID,请使用 32。
答案3
下面是简短的 Perl 脚本 - 使用猫获取 uuid 并不是最干净/最快的编码方式,但它使命令保持简短:
perl -e '
foreach (@ARGV) {
my $uid=qx|cat /proc/sys/kernel/random/uuid|;
chomp $uid;
(my $new=$_)=~s#(.*)\.#$uid.#;
rename($_, $new)
}
' ./*.file_ext
上面使用 Linux 上 /proc 中的文件作为 uuid 源:
[bash#] cat /proc/sys/kernel/random/uuid
d474706f-b18c-4e4b-8762-5ed577c74ac3
答案4
在 Linux 上:
(ret=0
for file in *; do
IFS= read -r uuid < /proc/sys/kernel/random/uuid || exit
mv -i -- "$file" "$uuid" || ret=$?
done
exit "$ret")