假设我有一个包含很多文件名的文件夹,其中一些文件名非常奇怪且无意义,我想将其重命名为
File-1
File-2
File-3
..
我已经尝试过这个(echo是为了tryng)
for name in *; do echo mv $name File-`echo $(( RANDOM % (10 - 5 + 1 ) + 1 ))`;done
但给我很多重复的
mv bio1 file-3
mv memory23 file-1
mv mernad file-3
mv nio2 file-4
mv nun3 file-4
答案1
你也许可以使用shuf
(来自 GNU coreutils 包),它会生成排列而不是单个随机样本 - 就像
for f in *; do read i; echo mv -- "$f" "file-$i"; done < <(shuf -i 1-10)
或者(也许更好)洗牌文件名- 然后简单地按顺序重命名它们
i=1; shuf -z -e -- * | while IFS= read -rd '' f; do echo mv -- "$f" "File-$((i++))"; done
答案2
pre=file ;
for old in * ;
do new=`xxd -l 16 -ps /dev/urandom` ;
while [ -f "$pre-$new" ] ; do new=`xxd -l 16 -ps /dev/urandom` ; done ;
mv "$old" "$pre-$new" ;
done ;
xxd
是一个二进制文件,通常带有:vim-common
package.json。
xxd
-l属性指的是你想要的随机长度。
xxd
-ps是获取 postscript 纯十六进制转储样式名称,例如:a4c794f3861f5d3e36ca9b0afd15ceab
/dev/urandom
是linux内核伪随机数生成器,如果没有,就写:mknod -m 444 /dev/urandom c 1 9
命令while [ -f "$pre-$new" ]
保证,没有其他文件具有相同的名称。
该[
命令通常包含在coreutils
包中。
变量pre
是选择一个名称前缀。如果您不需要前缀,可以将其留空:pre= ;
例如:
file 1
file 2
file 3
file 4
file 5
变成pre=file
:
file-062b9bcde91f1c56084956d175cfdfa3
file-3e7ec1bd5324a485a3402b106d320f73
file-648cf4550c70b2531350f231670fc982
file-074b2828b004f45581784ff1705c7ff3
file-481be2bb21f4b1e637293ae0ecf14f74
答案3
随机可能会返回重复值。按顺序生成数字怎么样?
count=0
for name in *; do count=`expr $count + 1` ; echo mv $name File-$count;done
答案4
如果您希望文件名最终按顺序排列(即 File-1 -> File-n),则应该按顺序进行操作。 --
count=0; for i in * ; do mv $i file-${count}; ((count++)); done