2016-10-05 64 views
1

尝试将文件重命名为随机字符串。为了生成随机字符串,我从this question的答案中拿了一些代码。将多个文件重命名为随机字符串仅重命名一个文件

#!/bin/bash 

chars=({a..z} {A..Z} {0..9}) 

function rand_string { 
    local c=$1 ret= 
    while((c--)); do 
     ret+=${chars[$((RANDOM%${#chars[@]}))]} 
    done 
    printf '%s\n' "$ret" 
} 

output=$(rand_string 10) 

实践中,我用一些纯文本文件在$HOME/practice做了一个目录。

/Users/me/practice/testfile1.txt 
/Users/me/practice/testfile2.txt 
/Users/me/practice/testfile3.txt 

当试图重命名这些文件一个随机字符串,而不是得到3个随机的名字,我反而留下了1个文件重命名为一个随机字符串。

for file in $HOME/practice/* 
do 
    mv "$file" $HOME/practice/"$output" 
done 

#result 
/Users/me/practice/i6TP3wiMDD 

更换mv "$file" ~/practice/"$output"echo "$file" "$output"让我发现,每一个文件,而不是生成的每一个文件一个新的随机字符串之后被重复的随机字符串。

/Users/me/practice/testfile1.txt i6TP3wiMDD 
/Users/me/practice/testfile2.txt i6TP3wiMDD 
/Users/me/practice/testfile3.txt i6TP3wiMDD 

我的问题是两个部分:

  1. 为什么只有1个文件被重命名?
  2. 如何为每个正在重命名的文件生成一个新的随机字符串?

我还会说上面的随机字符脚本超出了我目前的理解。我知道它适用于生成随机字符。但它的内部运作仍然不太清楚。

回答

1

问题是您只生成随机值的实例并将其存储在output变量中,并使用它来重命名循环中的所有文件。在定义she-bang(#!/bin/bash)之后,请参阅在使用set -x选项时运行的shell脚本扩展。

+++ rand_string 10 
+++ local c=10 ret= 
+++ ((c--)) 
+++ ret+=O 
+++ ((c--)) 
+++ ret+=k 
+++ ((c--)) 
+++ ret+=H 
+++ ((c--)) 
+++ ret+=Q 
+++ ((c--)) 
+++ ret+=1 
+++ ((c--)) 
+++ ret+=u 
+++ ((c--)) 
+++ ret+=9 
+++ ((c--)) 
+++ ret+=4 
+++ ((c--)) 
+++ ret+=c 
+++ ((c--)) 
+++ ret+=C 
+++ ((c--)) 
+++ printf '%s\n' OkHQ1u94cC  # <--- See the same random file-names used throughout the files 
++ output=OkHQ1u94cC 
++ for file in '*.txt' 
++ mv 1.txt OkHQ1u94cC 
++ for file in '*.txt' 
++ mv 2.txt OkHQ1u94cC 
++ for file in '*.txt' 
++ mv 5000.txt OkHQ1u94cC 
++ for file in '*.txt' 
++ mv 5100.txt OkHQ1u94cC 
++ for file in '*.txt' 
++ mv abc.txt OkHQ1u94cC 
++ for file in '*.txt' 
++ mv file.txt OkHQ1u94cC 
++ for file in '*.txt' 
++ mv final.txt OkHQ1u94cC 
++ for file in '*.txt' 
++ mv ini1.txt OkHQ1u94cC 
++ for file in '*.txt' 
++ mv ini2.txt OkHQ1u94cC 
++ for file in '*.txt' 
++ mv listing.txt OkHQ1u94cC 
++ for file in '*.txt' 
++ mv names.txt OkHQ1u94cC 
++ for file in '*.txt' 
++ mv parameters.txt OkHQ1u94cC 
++ for file in '*.txt' 
++ mv properties.txt OkHQ1u94cC 
++ for file in '*.txt' 
++ mv result.txt OkHQ1u94cC 

以上是我的样本数据。最好的方法是通过在扩展时调用函数来修复函数重命名中的for循环。像下面

#!/bin/bash 

for file in $HOME/practice/* 
do 
    mv "$file" $HOME/practice/"$(rand_string 10)" # <-- Here the random string length can be controlled as you need. 
done 
上述修复

现在,你可以看到我扩展为

+++ rand_string 10 
+++ local c=10 ret= 
+++ ((c--)) 
+++ ret+=7 
+++ ((c--)) 
+++ ret+=j 
+++ ((c--)) 
+++ ret+=U 
+++ ((c--)) 
+++ ret+=K 
+++ ((c--)) 
+++ ret+=l 
+++ ((c--)) 
+++ ret+=V 
+++ ((c--)) 
+++ ret+=l 
+++ ((c--)) 
+++ ret+=6 
+++ ((c--)) 
+++ ret+=8 
+++ ((c--)) 
+++ ret+=8 
+++ ((c--)) 
+++ printf '%s\n' 7jUKlVl688 
++ output=7jUKlVl688 
++ for file in '*.csv' 
+++ rand_string 10 
+++ local c=10 ret= 
+++ ((c--)) 
+++ ret+=N 
+++ ((c--)) 
+++ ret+=B 
+++ ((c--)) 
+++ ret+=O 
+++ ((c--)) 
+++ ret+=p 
+++ ((c--)) 
+++ ret+=j 
+++ ((c--)) 
+++ ret+=5 
+++ ((c--)) 
+++ ret+=T 
+++ ((c--)) 
+++ ret+=b 
+++ ((c--)) 
+++ ret+=S 
+++ ((c--)) 
+++ ret+=R 
+++ ((c--)) 
+++ printf '%s\n' NBOpj5TbSR 
++ mv 1.csv NBOpj5TbSR     # <- Unique file names generated. 
+++ rand_string 10 
+++ local c=10 ret= 
+++ ((c--)) 
+++ ret+=N 
+++ ((c--)) 
+++ ret+=R 
+++ ((c--)) 
+++ ret+=Y 
+++ ((c--)) 
+++ ret+=C 
+++ ((c--)) 
+++ ret+=C 
+++ ((c--)) 
+++ ret+=X 
+++ ((c--)) 
+++ ret+=L 
+++ ((c--)) 
+++ ret+=0 
+++ ((c--)) 
+++ ret+=e 
+++ ((c--)) 
+++ ret+=l 
+++ ((c--)) 
+++ printf '%s\n' NRYCCXL0el 
++ mv 2.csv NRYCCXL0el     # <- Unique file names generated. 
.csv文件重命名实际的脚本