2

Apple Mail にインポートしたい構造化フォルダに .emlx 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各結果のパスに対して生成されるファイルのリストを処理する方法がいくつかあります。

4

2 に答える 2

1

どうですか:

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

これは私のテスト環境でうまくいきました — 期待した結果が得られたという点では — しかし、find私が気に入らない警告も出ました (特に、なぜ警告が出たのかよくわからないからです)。 .

そのため、シェル スクリプトを作成し、それを関連するディレクトリごとfixmboxに実行しました。findこれがトレースです。このmessages.tgzファイルには、「開始点」のディレクトリ構造のコピーが含まれています。スクリプトは、変更されたディレクトリを削除し、resettar ファイルから元のディレクトリを復元します。私のプロンプトは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: 

警告がまったくないので、私は2番目を好みます。+演算子 tofindを使用して、 のように動作させることに注意してくださいxargs。のような単純なスクリプトを作成fixmboxし、それをfind(すべてのフープをジャンプしようとするよりもfind) から使用する方が、ほとんどの場合、より簡単に思えます。たとえば、fixmboxスクリプトが動作するように指定されたディレクトリの 1 つに既にMessagesディレクトリが存在する場合、失敗しないようにスクリプトを簡単に変更できます。もちろん、最初にディレクトリを除外するようにするfindこともできます。ファイルをさらに別のレベルのサブディレクトリに移動するMessages必要はありません。.emlxご了承くださいfixmboxディレクトリ名にスペースなどが含まれていても機能するように注意してください。どちらかを使用するバージョンでは、これを実現するのはそれほど簡単ではありませんsh -c "..."

(.emlxファイルはすべて空でした。ファイルのサイズは、この問題では問題になりませんでした。)

于 2012-11-03T19:41:58.293 に答える
0

回避策として、xargs に渡すのではなく、ファイルのリストをファイルに入れることができます。その後、それらを反復して移動できます

find /path/to/folders/ -name \*.emlx -print0 > filelist
for f in $(cat filelist) ; do mv $f ./Messages/ ; done
于 2012-11-03T16:16:11.670 に答える