どうですか:
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ファイルはすべて空でした。ファイルのサイズは、この問題では問題になりませんでした。)