使用find和exec创建目录,然后使用该目录的相对路径



我在结构化文件夹中有一堆.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相对于每个结果的路径生成的文件列表。

关于:

find /path/to/folders/* -type d 
-exec mv {} {}.mbox ; 
-exec mkdir {}.mbox/Messages ; 
-exec sh -c "mv {}.mbox/*.emlx {}.mbox/Messages" ;

这在我的测试环境中对我有效——就它给了我预期的结果而言——但它也从find得到了一个我不喜欢的警告(尤其是因为我不太确定它为什么会发出警告)。

因此,我将创建一个名为fixmbox的shell脚本,并让find为每个相关目录运行该脚本。这是痕迹。messages.tgz文件包含"起点"目录结构的副本;CCD_ 6脚本从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目录;那些不需要将其CCD_ 22文件移动到另一级别的子目录中。注意,即使目录名中有空格等,fixmbox也会非常小心地确保它能工作;使用CCD_ 24的版本也不那么容易实现。

(.emlx文件都是空的;文件的大小不是这个问题的问题。)

一个解决方法是,将文件列表放入一个文件中,而不是移交给xargs。之后,您可以对它们进行迭代并移动

find /path/to/folders/ -name *.emlx -print0 > filelist
for f in $(cat filelist) ; do mv $f ./Messages/ ; done

相关内容

  • 没有找到相关文章

最新更新