【问题标题】:Script to distribute a large number of files in to smaller groups将大量文件分发到较小组的脚本
【发布时间】:2011-01-29 21:32:16
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果您展示您的代码,我们可以改进它。
  • @Dennis:这有点尴尬。当我的笔记本电脑驱动器死机时,我丢失了脚本,现在,在考虑重写脚本时,我想我会先向 SO 社区寻求帮助。

标签: linux shell scripting applescript


【解决方案1】:

这应该让你开始:

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

【讨论】:

  • 效果很好,谢谢。我将循环的前三行复制到“完成”之后,并将剩余的文件移动到最后一个文件夹中。它在 6 秒内处理了大约 1100 个文件 :)
  • 虽然我注意到一个(小)问题。第一个文件夹中只有BATCH_SIZE - 1 文件,其他文件夹的编号正确。虽然我不需要文件数量完全相同,但这没问题,我只需要每个文件夹中有一个更易于管理的数量。
【解决方案2】:

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

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

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

【讨论】:

  • 我没有机会在我的 Linux 机器上尝试这个,但是当我在我的 MacBook 上运行它时出现错误:_: line 3: /tmp/counter1: syntax error: operand expected (错误标记是“/tmp/counter1”)我会去解决它,但你知道可能出了什么问题吗?
  • @Tony:对不起,我忘了把目录放在一行。它应该是`n=${n#/tmp/counter}; \`。我已经更正了我的答案。
【解决方案3】:

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

之前:

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

这应该很快就会工作,因为您的脚本执行的移动命令可以使用简单的全局扩展来选择所有要移动的文件,ala mv aa* a/aa,而不是必须对每个文件单独运行移动命令(这将是我对原始脚本为何缓慢的第一个猜测)

【讨论】:

  • 谢谢,这是一个有用的提示。我必须尝试编写解决方案的脚本,看看它是如何执行的。
猜你喜欢
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
相关资源
最近更新 更多