如何递归地随机化文件名?
如何递归地随机化文件名?
嘿,我来帮你搞定这个递归重命名的问题!你原来的脚本在单个目录里用得很好,要扩展到所有子目录的话,有几种简单实用的方法可以实现:
方法一:使用 find 命令(最通用的方式)
find 命令天生擅长递归遍历目录,我们可以把它和你原有的重命名逻辑结合起来,一次性处理所有子目录里的 .png 文件:
find . -type f -name "*.png" -exec bash -c 'mv -- "$0" "$(dirname "$0")/$RANDOM-$RANDOM-$RANDOM.png"' {} \;
我给你拆解一下这个命令的逻辑:
find . -type f -name "*.png":从当前目录(.)开始,查找所有类型为普通文件(-type f)且后缀是.png的文件-exec bash -c '...' {} \;:对每一个找到的文件执行后面的bash命令,{}会自动替换成当前找到的文件完整路径$(dirname "$0"):获取当前文件所在的目录,确保重命名后的文件还留在原来的目录里,不会跑到当前工作目录$RANDOM-$RANDOM-$RANDOM.png:和你原来的逻辑一致,生成由三组随机数组成的新文件名
方法二:用 Bash 的 globstar 选项(适合 Bash 4+ 版本)
如果你用的是 Bash 4 或更高版本,可以开启 globstar 选项,它能让通配符 ** 递归匹配所有子目录,写法和你原脚本几乎一样:
先开启这个选项(如果还没开的话):
shopt -s globstar
然后执行重命名脚本:
for file in **/*.png; do mv -- "$file" "$(dirname "$file")/$RANDOM-$RANDOM-$RANDOM.png" done
这个方法只是把你原脚本里的 *.png 换成了 **/*.png,** 会帮你遍历当前目录下所有层级的子目录里的 .png 文件。要是你想每次打开终端都自动开启 globstar,可以把 shopt -s globstar 加到你的 ~/.bashrc 文件里。
小提醒
- 命令里的
--是为了兼容那些文件名开头带-的文件,避免mv把它们当成命令选项处理 - 虽然
$RANDOM生成重复值的概率极低,但如果你的文件数量特别多,也可以用更唯一的标识符,比如$(uuidgen)替换$RANDOM-$RANDOM-$RANDOM,生成的文件名会类似a1b2c3d4-1234-5678-90ab-cdef01234567.png,完全不会重复
备注:内容来源于stack exchange,提问作者Nuno Fonseca
相关产品推荐
相关产品推荐

