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

我有文件夹包含大量的文件(如1000+)的各种大小,我想移动到更小的组,例如,每个文件夹100个文件。

我编写了一个计算文件的Apple脚本,创build了一个编号的子文件夹,然后将100个文件移动到新文件夹中(可以指定文件的数量),这个文件夹循环到指定数量的文件它创build的最后一个文件夹。

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

如何分组文件不是特别重要,我只想在每个文件夹中的文件较less。

这应该让你开始:

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语句获取最后的剩余文件。 您可以根据需要添加一些额外的检查,以便在修改后使用。

这是一个巨大的混乱,但它不应该太慢,

 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"' _ 

这是完全不分青红皂白的,哪些文件去哪里。

解决文件中文件太多的目录问题的最常用方法是用名称的前两个字符来细分。 例如:

之前:

 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 

这应该很快,因为脚本执行的移动命令可以使用简单的glob扩展来选择所有要移动的文件,而不是必须在每个文件上单独运行移动命令(这是这将是我的第一个猜测,为什么原始脚本很慢)