我在结构化文件夹中有一堆.emlx Apple Mail文件,我想将其导入Apple Mail。我知道我可以手动执行此操作,方法是将文件夹重命名为folder.mbox,然后将.emlx文件放在名为“Messages”的嵌套文件夹中。
我有数百个这样的文件夹,所以我试图用bash而不是手动执行它。
我可以设置基本结构:
find /path/to/folders/* -type d -exec mv {} {}.mbox \; -exec mkdir {}.mbox/Messages \;
但是我无法弄清楚如何将.emlx文件移动到新创建的子文件夹中。我试过这个:
find /path/to/folders/ -name \*.emlx -print0 | xargs -0 -I {} mv {} ./Messages/
...我认为这是一个很长的镜头,但肯定有一些方法可以处理find
相对于每个结果路径生成的文件列表。
答案 0 :(得分:1)
怎么样:
find /path/to/folders/* -type d \
-exec mv {} {}.mbox \; \
-exec mkdir {}.mbox/Messages \; \
-exec sh -c "mv {}.mbox/*.emlx {}.mbox/Messages" \;
这在我的测试环境中对我有用 - 就它给我的预期结果而言 - 但它也得到find
的警告我不喜欢(尤其是因为我&# 39;我不太确定为什么会发出警告)。
所以,我会创建一个我称为fixmbox
的shell脚本,并为每个相关目录运行find
。这是追踪。 messages.tgz
文件包含“起点”的副本。目录结构; reset
脚本删除已更改的目录并从tar文件恢复原始文件。我的提示是Osiris JL:
。
注意:我添加了-name 'm?'
条件,以避免处理当前目录.
时出现问题;你可能不需要那个。
doit-all-in-one
Osiris JL: reset
Osiris JL: ls -R
doit doit-all-in-one fixmbox m1 m2 messages.tgz reset
./m1:
email-0.emlx email-2.emlx email-4.emlx email-6.emlx email-8.emlx
email-1.emlx email-3.emlx email-5.emlx email-7.emlx email-9.emlx
./m2:
email-0.emlx email-2.emlx email-4.emlx email-6.emlx email-8.emlx
email-1.emlx email-3.emlx email-5.emlx email-7.emlx email-9.emlx
Osiris JL: cat doit-all-in-one
set -x
path_to_folders=.
find "$path_to_folders" -name 'm?' -type d \
-exec mv {} {}.mbox \; \
-exec mkdir {}.mbox/Messages \; \
-exec sh -c "mv {}.mbox/*.emlx {}.mbox/Messages" \;
Osiris JL: bash doit-all-in-one
+ path_to_folders=.
+ find . -name 'm?' -type d -exec mv '{}' '{}.mbox' ';' -exec mkdir '{}.mbox/Messages' ';' -exec sh -c 'mv {}.mbox/*.emlx {}.mbox/Messages' ';'
find: ./m1: No such file or directory
find: ./m2: No such file or directory
Osiris JL: ls -R
doit doit-all-in-one fixmbox m1.mbox m2.mbox messages.tgz reset
./m1.mbox:
Messages
./m1.mbox/Messages:
email-0.emlx email-2.emlx email-4.emlx email-6.emlx email-8.emlx
email-1.emlx email-3.emlx email-5.emlx email-7.emlx email-9.emlx
./m2.mbox:
Messages
./m2.mbox/Messages:
email-0.emlx email-2.emlx email-4.emlx email-6.emlx email-8.emlx
email-1.emlx email-3.emlx email-5.emlx email-7.emlx email-9.emlx
Osiris JL:
fixmbox
:Osiris JL: reset
Osiris JL: cat fixmbox
for dir in "$@"
do
echo "$dir"
mv "$dir" "$dir".mbox
mkdir "$dir".mbox/Messages
mv "$dir".mbox/*.emlx "$dir".mbox/Messages
done
Osiris JL: find . -name 'm?' -type d -exec ./fixmbox {} +
./m1
./m2
Osiris JL: ls -R
doit doit-all-in-one fixmbox m1.mbox m2.mbox messages.tgz reset
./m1.mbox:
Messages
./m1.mbox/Messages:
email-0.emlx email-2.emlx email-4.emlx email-6.emlx email-8.emlx
email-1.emlx email-3.emlx email-5.emlx email-7.emlx email-9.emlx
./m2.mbox:
Messages
./m2.mbox/Messages:
email-0.emlx email-2.emlx email-4.emlx email-6.emlx email-8.emlx
email-1.emlx email-3.emlx email-5.emlx email-7.emlx email-9.emlx
Osiris JL:
我更喜欢第二种,因为根本没有警告。请注意+
运算符用于find
,使其行为与xargs
相似。编写一个简单的脚本,如fixmbox
然后从find
使用它(而不是试图让find
跳过所有的箍)对我来说似乎比较简单。例如,fixmbox
脚本可以被简单地修改为如果在其中一个目录中已经存在Messages
目录,则不会失败。当然,find
可以首先排除Messages
个目录;那些不需要将.emlx
文件移到另一级子目录中的人。请注意fixmbox
非常小心,即使目录名中有空格等,也要确保它能正常工作;使用sh -c "..."
的版本也不容易实现。
(.emlx
个文件都是空的;文件的大小不是这个问题的问题。)
答案 1 :(得分:0)
解决方法可能是,您将文件列表放入文件而不是移交给xargs。之后,你可以迭代它们并移动'em
find /path/to/folders/ -name \*.emlx -print0 > filelist
for f in $(cat filelist) ; do mv $f ./Messages/ ; done