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