关于什么:
find /path/to/folders/* -type d \
-exec mv {} {}.mbox \; \
-exec mkdir {}.mbox/Messages \; \
-exec sh -c "mv {}.mbox/*.emlx {}.mbox/Messages" \;
这在我的测试环境中对我有用——就它给了我预期的结果而言——但它也得到了一个find
我不喜欢的警告(尤其是因为我不太确定它为什么给出警告) .
因此,我将创建一个名为 的 shell 脚本fixmbox
,并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
文件都是空的;文件的大小不是这个问题的问题。)