以随机顺序将文件移动到几个目录

时间:2015-07-16 12:35:41

标签: bash unix solaris-10

我想以随机顺序将大量文件从一个目录移动到几个目录dst/f0..dst/f9

我试着这样做:

ls src/*.xml | head |  xargs -I {} mv {}  f$(($RANDOM % 10))

但所有文件都已移至一个目录src / fN

我该怎么做?感谢

3 个答案:

答案 0 :(得分:3)

您编写它的方式,$RANDOM只执行一次。最好生成一个每次调用它的循环:

for file in src/*.xml
do
    mv "$file" "f$((RANDOM % 10))"
done

这样你也可以避免解析ls的输出,a bit dangerous

为了加快速度,您可以使用awk。如果你有GNU awk,例如:

awk -v seed=$RANDOM 'BEGIN{srand(seed)} FNR==1{printf "mv \"%s\" dst/f%d\n", FILENAME, int(rand()*10); nextfile}' *

这使用Random numbers generation with awk in BASH shellnextfile中描述的srand()

这将写出一个充满mv file dir/个表达式的文件,每行一个。然后,只需cat file | sh执行即可。

答案 1 :(得分:1)

这是使用xargs的另一种方式。

ls src/*.xml | xargs -i bash -c 'mv {}  f$(($RANDOM % 10))'

看起来更直接,但我会选择@fedorqui解决方案。 xargs将产生尽可能多的进程

答案 2 :(得分:0)

这是基于@fedorqui解决方案的最快解决方案。谢谢@fedorqui!

F8:IR254

我测量了这个脚本的速度。它运作得很快

ls -1 -f | /usr/xpg4/bin/awk -v seed=$RANDOM 'BEGIN{srand(seed)} /\.xml$/ {printf "mv \"%s\" dst/f%d\n", $1, int(rand()*10)}' | sh

脚本输出

date;ls -1 -f | /usr/xpg4/bin/awk -v seed=$RANDOM 'BEGIN{srand(seed)} /\.xml$/ {printf "mv \"%s\" dst/f%d\n", $1, int(rand()*10)}' > list.sh;date;cat list.sh | wc -l

我理解解析Fri Jul 17 13:21:54 YEKT 2015 Fri Jul 17 13:21:54 YEKT 2015 29142 的输出可能不安全。但在这种特殊情况下我不需要便携式解决方案