以随机顺序将文件移动到几个目录
move files to a few directories in random order
我想以随机顺序将大量文件从一个目录移动到几个目录dst/f0..dst/f9
。
我试过这样做:
ls src/*.xml | head | xargs -I {} mv {} f$(($RANDOM % 10))
但是所有文件都被移动到一个目录中src/fN
我该怎么做?谢谢
按照你写的方式,$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}' *
这使用 srand()
,如 Random numbers generation with awk in BASH shell and nextfile
中所述。
这将写入一个充满 mv file dir/
表达式的文件,每行一个。然后,只需执行 cat file | sh
即可执行它。
这是使用 xargs
的另一种方法。
ls src/*.xml | xargs -i bash -c 'mv {} f$(($RANDOM % 10))'
它看起来更直,但我会选择@fedorqui 解决方案。 xargs
将产生尽可能多的进程,有输入
这是基于@fedorqui 解决方案的最快解决方案。谢谢@fedorqui!
ls -1 -f | /usr/xpg4/bin/awk -v seed=$RANDOM 'BEGIN{srand(seed)} /\.xml$/ {printf "mv \"%s\" dst/f%d\n", , 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", , 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
我理解解析 ls
的输出可能不安全。但在这种特殊情况下我不需要便携式解决方案
我想以随机顺序将大量文件从一个目录移动到几个目录dst/f0..dst/f9
。
我试过这样做:
ls src/*.xml | head | xargs -I {} mv {} f$(($RANDOM % 10))
但是所有文件都被移动到一个目录中src/fN
我该怎么做?谢谢
按照你写的方式,$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}' *
这使用 srand()
,如 Random numbers generation with awk in BASH shell and nextfile
中所述。
这将写入一个充满 mv file dir/
表达式的文件,每行一个。然后,只需执行 cat file | sh
即可执行它。
这是使用 xargs
的另一种方法。
ls src/*.xml | xargs -i bash -c 'mv {} f$(($RANDOM % 10))'
它看起来更直,但我会选择@fedorqui 解决方案。 xargs
将产生尽可能多的进程,有输入
这是基于@fedorqui 解决方案的最快解决方案。谢谢@fedorqui!
ls -1 -f | /usr/xpg4/bin/awk -v seed=$RANDOM 'BEGIN{srand(seed)} /\.xml$/ {printf "mv \"%s\" dst/f%d\n", , 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", , 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
我理解解析 ls
的输出可能不安全。但在这种特殊情况下我不需要便携式解决方案