将 53,800 多个文件移动到 54 个单独的文件夹中,每个文件夹约有 1000 个文件?

将 53,800 多个文件移动到 54 个单独的文件夹中,每个文件夹约有 1000 个文件?

尝试使用 Gmail 的 POP 获取程序导入 53,800 多个单独的文件(消息)。

Gmail 理所当然地拒绝了,并给出了错误:“要下载的消息太多。其他服务器上的消息太多。”

该文件夹看起来类似于:

/usr/home/customer/Maildir/cur/1203672790.V57I586f04M867101.mail.net:2,S
/usr/home/customer/Maildir/cur/1203676329.V57I586f22M520117.mail.net:2,S
/usr/home/customer/Maildir/cur/1203677194.V57I586f26M688004.mail.net:2,S
/usr/home/customer/Maildir/cur/1203679158.V57I586f2bM182864.mail.net:2,S
/usr/home/customer/Maildir/cur/1203680493.V57I586f33M740378.mail.net:2,S
/usr/home/customer/Maildir/cur/1203685837.V57I586f0bM835200.mail.net:2,S
/usr/home/customer/Maildir/cur/1203687920.V57I586f65M995884.mail.net:2,S
...

使用 shell(FreeBSD 上的 tcsh、sh 等),我可以输入哪行命令来将这个充满文件的目录拆分为单独的文件夹,以便 Gmail 每次只能看到 1000 条消息? 也许可以使用 find 或 ls | xargs mv。无论哪个速度最快都可以。

所需的输出目录现在看起来像这样:

/usr/home/customer/Maildir/cur/1203672790.V57I586f04M867101.mail.net:2,S
/usr/home/customer/Maildir/cur/1203676329.V57I586f22M520117.mail.net:2,S
...
/usr/home/customer/set1/ (contains messages 1-1000)
/usr/home/customer/set2/ (contains messages 1001-2000)
/usr/home/customer/set3/ (etc.)

答案1

它不是一行程序,但你可以复制这样的块(在 csh 中):

foreach file (`ls | head -n 1000`)
mv $file /tmp/new/dir
end

我不能 100% 确定管道是否能处理您拥有的文件数量,但值得一试。此外,您可能能够使用此命令一次处理 500 个文件,只需将 1000 更改为 500 即可。

答案2

count=target=0;

find srcdir/ -type f |
    while read file; do

        count=$((count+1));
        target=$((count/10000));

        [ -d $target ] || mkdir $target

        echo mv "$file" $target; #remove the 'echo' if you like what you see
    done

折叠为一行(并且删除了‘回声’保护措施):

count=target=0; find srcdir/ -type f | while read file; do count=$((count+1)); target=$((count/10000)); [ -d $target ] || mkdir $target; mv "$file" $target; done

这不是最快的,但很干净。此解决方案避免解析“ls”的输出http://mywiki.wooledge.org/ParsingLs并将对“$file”的引用括起来,否则具有异常名称的文件(如 Maildir 文件)会破坏代码。例如,如果任何文件有空格或分号,那么引用没有引号的 $file 不会有什么效果(大多数情况下)

阅读更多有关引用的内容:http://mywiki.wooledge.org/Quoteshttp://wiki.bash-hackers.org/syntax/words

相关内容