随机重命名文件但不重复

随机重命名文件但不重复

假设我有一个包含很多文件名的文件夹,其中一些文件名非常奇怪且无意义,我想将其重命名为

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-commonpackage.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 

相关内容