如何从包含大量文件的文件夹中复制/压缩文件?

如何从包含大量文件的文件夹中复制/压缩文件?

所以,我犯了一个小错误。在从源收集数据的过程中,我将所有内容转储到外部磁盘的根目录中,该磁盘现在拥有大约 600k+ 文件(总共 23 GB)。以下是我想做的几个选项:

  1. 将一定数量的文件从磁盘移动到我的硬盘。
  2. 创建子文件夹(每个子文件夹包含 1000 个文件)并在它们之间分发文件。
  3. 将整个文件或部分文件(例如 50,000 个文件)打包并移动到我的磁盘上。

但无论我尝试做什么,似乎都需要永远。有人可以帮助我了解执行这些操作的最佳/最有效的方法吗?谢谢。

答案1

下面将创建一个名为 的子目录new,然后创建 50 个编号为..的new子目录。然后,它将最多将 1000 个文件从当前目录移动到每个目录中。new/01new/50new/*

注 1:如果出现以下任一情况,则该方法将不起作用文件名\n其中有换行符 ( ) 。

注2:这需要 GNUxargs和 GNU mv。您正在运行 Linux,因此这些是标准的。

您可以更改数字(50 和 1000)和基本目录以满足您的需要。

#! /bin/sh

BASEDIR='new'
SUBDIRS=50
FILECOUNT=1000

mkdir -p "$BASEDIR"

for i in $(seq -w 1 "$SUBDIRS") ; do
   mkdir -p "$BASEDIR/$i"

   # move maximum of $FILECOUNT files to new/$i
   find . -maxdepth 1 -type f | head -n "$FILECOUNT" | xargs -d'\n' mv -t "$BASEDIR/$i"
done

如果您想要移动的文件全部匹配特定模式,那么您可以使用查找-name-regex选项来选择它们。紧跟在-type f.之后添加选项。例如,如果您只想移动.txt文件:

find . -maxdepth 1 -type f -name '*.txt' | head -n "$FILECOUNT" | xargs -d'\n' mv -t "$BASEDIR/$i"

非 GNU 版本无法使用mv -t.它也不能使用xargs -d选项,但您可以使用tr '\n' '\0'将换行符转换为 NUL 字符以供输入- 同样,这可以处理文件名中 xargs -0r没有 的任何文件。是非 posix,是 的 freebsd 扩展,您可以安全地删除该选项,但操作会运行得慢很多。\n-R -1xargsmv

#! /bin/sh

BASEDIR='new'
SUBDIRS=50
FILECOUNT=1000

mkdir -p "$BASEDIR"

for i in $(seq -w 1 "$SUBDIRS") ; do
   mkdir -p "$BASEDIR/$i"

   # move maximum of $FILECOUNT files to new/$i
   find . -maxdepth 1 -type f | head -n "$FILECOUNT" | tr '\n' '\0' | xargs -0r -R -1 -I % mv % "$BASEDIR/$i"
done

相关内容