用于将大量文件分发到较小组的脚本

时间:2011-01-29 21:32:16

标签: linux shell scripting applescript

我的文件夹中包含大量不同大小的文件(例如1000+),我想将这些文件移到较小的组中,例如每个文件夹100个文件。

我写了一个Apple脚本,它对文件进行了计数,创建了一个带编号的子文件夹,然后将100个文件移入新文件夹(可以指定文件数),这些文件循环到文件数量少于指定数量的文件移动到它创建的最后一个文件夹。

问题在于它的运行速度非常慢。我正在寻找可以在我的MacBook和/或Linux机器上运行的Apple脚本或shell脚本,它可以有效地将文件移动到更小的组中。

如何对文件进行分组并不是特别重要,我只希望每个文件夹中的文件更少。

3 个答案:

答案 0 :(得分:3)

这是一个巨大的障碍,但它不应该太慢:

rm /tmp/counter*
touch /tmp/counter1
find /source/dir -type f -print0 | 
    xargs -0 -n 100 \
        sh -c 'n=$(echo /tmp/counter*); \
               n=${n#/tmp/counter}; \
               counter="/tmp/counter$n"; \
               mv "$counter" "/tmp/counter$((n+1))"; \
               mkdir "/dest/dir/$n"; \
               mv "$@" "/dest/dir/$n"' _

对于哪些文件放在哪里,完全不分青红皂白。

答案 1 :(得分:2)

这应该让你开始:

DIR=$1
BATCH_SIZE=$2
SUBFOLDER_NAME=$3
COUNTER=1

while [ `find $DIR -maxdepth 1 -type f| wc -l` -gt $BATCH_SIZE ] ; do
  NEW_DIR=$DIR/${SUBFOLDER_NAME}${COUNTER}
  mkdir $NEW_DIR
  find $DIR -maxdepth 1 -type f | head -n $BATCH_SIZE | xargs -I {} mv {} $NEW_DIR
  let COUNTER++
if [ `find $DIR -maxdepth 1 -type f| wc -l` -le $BATCH_SIZE ] ; then
  mkdir $NEW_DIR
  find $DIR -maxdepth 1 -type f | head -n $BATCH_SIZE | xargs -I {} mv {} $NEW_DIR
fi
done

嵌套的if语句获取最后剩余的文件。修改后,您可以根据需要添加一些额外的检查。

答案 2 :(得分:1)

解决文件中包含太多文件的目录问题的最常见方法是按名称的前几个字符进行细分。例如:

在:

aardvark
apple
architect
...
zebra
zork

后:

a/aardvark
a/apple
a/architect
b/...
...
z/zebra
z/zork

如果不能很好地细分,那么更进一步:

a/aa/aardvark
a/ap/apple
a/ar/architect
...
z/ze/zebra
z/zo/zork

这应该可以很快地运行,因为脚本执行的move命令可以使用简单的glob扩展来选择要移动的所有文件,ala mv aa* a/aa,而不必在每个文件上单独运行move命令(这是我对原始剧本缓慢的原因的第一次猜测)