尝试使用 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/Quotes和http://wiki.bash-hackers.org/syntax/words