所以,我犯了一个小错误。在从源收集数据的过程中,我将所有内容转储到外部磁盘的根目录中,该磁盘现在拥有大约 600k+ 文件(总共 23 GB)。以下是我想做的几个选项:
- 将一定数量的文件从磁盘移动到我的硬盘。
- 创建子文件夹(每个子文件夹包含 1000 个文件)并在它们之间分发文件。
- 将整个文件或部分文件(例如 50,000 个文件)打包并移动到我的磁盘上。
但无论我尝试做什么,似乎都需要永远。有人可以帮助我了解执行这些操作的最佳/最有效的方法吗?谢谢。
答案1
下面将创建一个名为 的子目录new
,然后创建 50 个编号为..的new
子目录。然后,它将最多将 1000 个文件从当前目录移动到每个目录中。new/01
new/50
new/*
注 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 -1
xargs
mv
#! /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