答案
发件人GNU Bash手册-Shopt内置:
全球之星
如果设置,文件名扩展上下文中使用的模式“**”将匹配所有文件以及零个或多个目录和子目录。如果模式后面跟一个“/”,只有目录和子目录匹配。
所以,以纯粹的方式,我会:
shopt-s全球之星对于**/*.png中的f;做base_path=“${f%/*}”[“${base_path}”=“${f}”]&&基本路径=||base_path=“${base_path}/”mv-n“${f}”“${base_path}”${随机}-${随机}-${RANDOM}.png“完成
${f%/*}
:将扩展到删除所有内容后剩下的内容,直到/
找到字符(包括/
字符)来自$f美元
,从末尾开始(基本上,它将扩展到$f美元
的基路径),或设置为的值$f美元
如果模式不匹配(例如,在.png码
当前工作目录中的文件)
- 以下章节
base_path=“${f%/*}”
和之前mv-n“${f}”“${base_path}”${随机}-${随机}-${RANDOM}.png“
将设置$基本路径
如果的值为$基本路径
字符串等于$f美元
,或将添加尾部/
到$基本路径
否则
-n个
:将阻止毫伏
在生成的文件名恰好与一个文件名匹配的情况下(不太可能)覆盖可能已经存在的文件;在这种情况下,一条消息将打印到屏幕上,您将能够再次旋转命令
$树. ├── foo公司│∑-1.png│千兆帕│∑-2.png│⑪——巴兹│节气门-3.png└── 脚本.sh4个目录,4个文件$shopt-s全球之星**/*.png中f的$;做base_path=“${f%/*}”[“${base_path}”=“${f}”]&&基本路径=||base_path=“${base_path}/”mv-n“${f}”“${base_path}”${随机}-${随机}-${RANDOM}.png“完成$树.├── foo公司2012年-21462-21532-6024.png│千兆帕│——8568-7432-8514.png│千兆赫│电话:19171-25385-32563.png└── 脚本.sh4个目录,4个文件
关于Zsh的一点注记
在Zsh中,您可以在不设置任何shell选项的情况下执行完全相同的操作:
对于**/*.png中的f;做base_path=“${f%/*}”[“${base_path}”=“${f}”]&&基本路径=||base_path=“${base_path}/”mv-n“${f}”“${base_path}”${随机}-${随机}-${RANDOM}.png“完成
扩展:使用自定义值而不是$随机
如果你愿意$随机
要成为0-32767范围内的数字以外的数字,您可以利用/开发/uradom
生成自定义随机值。
例如,要生成长度为5的随机字母数字字符串:
tr-dc“[:alnum:]”</dev/urandom|fold-w5|head-n1
tr-dc“[:alnum:]”</dev/uradom
:将从中不确定地读取/开发/uradom
,仅打印字符集中的字符[:铝:]
(相当于[0-9A-Za-z]
,因此只打印数字和大小写字母字符)
折叠-w5
:将拆分的输出信托收据
直线长度为5
头部-n1
:将打印第一行,立即关闭管道
请参见手动变速器
了解更多选项。
将上述应用于您的命令(使tr-dc“[:alnum:]”</dev/urandom|fold-w5|head-n1
到函数中,以避免尴尬地调用它3次并设置3$兰特
变量):
函数rand(){tr-dc“[:alnum:]”</dev/urandom|fold-w5|head-n1}shopt-s全球之星对于**/*.png中的f;做base_path=“${f%/*}”[“${base_path}”=“${f}”]&&基本路径=||base_path=“${base_path}/”mv-n“${f}”“${base_path}”$(兰德)“-”$(兰特)“-“$(兰德)”.png“完成
$函数rand(){tr-dc“[:alnum:]”</dev/urantom|fold-w5|head-n1}$shopt-s全球之星**/*.png中f的$;做base_path=“${f%/*}”[“${base_path}”=“${f}”]&&基本路径=||base_path=“${base_path}/”mv-n“${f}”“${base_path}”$(兰德)“-”$(兰特)“-“$(兰德)”.png“完成$树.├── foo公司│-5dL7N-1DHgd-YV6Uw.png型│千兆帕2012年-2nwhr-N0YpM-1ABn0.png│⑪——巴兹│●——IiohU-JTW1k-4PgFk.png└── 脚本.sh4个目录,4个文件
扩展:一次处理多个扩展
根据OP的要求:这是一个修改后的版本,可以同时处理多个扩展(笔记:这只能正确处理扩展,例如.巴
,扩展,例如.foo.bar文件
将需要一种更复杂的方法来正确处理):
shopt-s全球之星对于**/*中的f。{png,gif};做base_path=“${f%/*}”[“${base_path}”=“${f}”]&&基本路径=||base_path=“${base_path}/”ext=“${f#*.}”mv-n“${f}”“${base_path}”${随机}-${随机}-${随机}${ext}“完成
**/*.{png,gif}
:将扩展到**/*.png**/*.gif
,最终匹配以结尾的文件.png码
和以结尾的文件.gif文件
${f#*.}
:将扩展到删除所有内容后剩下的内容,直到最后.
找到字符(包括.
字符)来自$f美元
,从一开始(基本上,它将扩展到$f美元
的扩展名)
$树.├── foo公司│∑-1.png│千兆帕│∑-2.gif│千兆赫│节气门-3.png└── 脚本.sh4个目录,4个文件$shopt-s全球之星**/*中的f为$。{png,gif};做base_path=“${f%/*}”[“${base_path}”=“${f}”]&&基本路径=||base_path=“${base_path}/”ext=“${f#*.}”mv-n“${f}”“${base_path}”${随机}-${随机}-${随机}${ext}“完成$树.├── foo公司│——27150-25336-3117.png│千兆帕2012年——4841-14490-4418.gif│⑪——巴兹│电话:-27852-28183-26777.png└── 脚本.sh4个目录,4个文件