2019年7月31日水曜日

【備忘録】Mac で 大量の同一 USB メモリに、同じデータをコマンドラインからコピーするには・・・

Mac で 大量の同一 USB メモリに、同じデータを入れる場合、.DS_Store、.Spotlight-V100 とか Windows OSからみたらゴミのようなデータも入ってしまいます。さらにUSBメモリに入っているデータは消した上で、コピーしたい場合に通常ではコマンドラインから消せないファイルもあります(.Spotlight-V100とか)。



2,3個ぐらいならいいのですが、多くなってくるとこれをいちいち GUI で取り除くなんて面倒なことはやっていられません。

筆者も 40個ほどの USBメモリについて依頼されて2,3しましたが飽きました (^^;



上記で20個ほどです。
こういうときにはシェルスクリプトですよね!

1. USB メモリにデータをコピー
2. 不要なフォルダやファイルは削除する
3. すべての処理が終わったら、USBメモリを取り外し可能な状態にする

これが自動化できたら便利です。
これについて簡易的なものを作成したので備忘録がてら(また使うかもしれないので)載せておきます。

USB.sh (sh シェルスクリプト)

ーーー
#!/bin/sh

export USB_DIR="/Volumes/hogehoge/"
export USB_SRC="$HOME/Desktop/USB/"

if [ ! -d "$USB_DIR" ]; then
  echo "Cannot find out USB MEMORY".
  exit
fi
if [ ! -d "$USB_SRC" ]; then
  echo "Cannot find out the source data".
  exit
fi
sudo mdutil -i off "$USB_DIR"


rsync -av "$USB_SRC" "$USB_DIR" --delete

find "$USB_DIR" \( -name '.DS_Store' -o -name '._*' -o -name '.apdisk' -o -name 'Thumbs.db' -o -name 'Desktop.ini' \) -delete -print


rm -rf "$USB_DIR"/.fseventsd
rm -rf "$USB_DIR"/.Spotlight-V100
rm -rf "$USB_DIR"/.Trashes

ls -lga "$USB_DIR"

sync

sleep 1

sudo umount $USB_DIR
ーーー
hogehoge の部分に、USBメモリとして認識するラベル名を入れます。同じUSBメモリなら同じ名前でしょう。違うなら、ここはコマンドラインから入力するように改変が必要ですね。
USBの部分は、コピー元のフォルダです。ここではデスクトップのUSBフォルダにしてます。

大まかな流れ


1. 「ターミナル」アプリに対して「フルディスクアクセス」権限を一時的に付与します。
システム環境設定 >  セキュリティとプライバシー > プライバシー > フルディスクアクセス に追加



これを忘れると、.Spotlight-V100 などシステムが生成するフォルダやファイルを消そうとすると、権限がないとエラーがでます。ただフル権限を与えてしまうものなので、使い終わったら権限を剥奪しておくのがよいです。

2. ターミナルより、USB.sh (今回はその名前で保存した)を実行します。
sh ~/Desktop/USB.sh
とか(デスクトップに保存したなら)。

3. USBメモリに対する Spotlight 検索インデックス作成をOFFにします。

4. コピー先とコピー元に、準備したフォルダがあるかどうか確認します。なければ終了

5. データを rsync コマンドでコピーします。コピー先にあるデータは全部消します。

6. 不要なファイルやフォルダを削除します。

7. USBメモリのトップのファイル一覧を表示してから、1秒待って、USBメモリを取り外します。

あまり速く取り外すと、Busy とかいって取り出せないこともあるので少しまってみるということです。

これで 100や200個ぐらいなら耐えることができるでしょう。

注意


export USB_DIR="/Volumes/hogehoge/"

の保存先をうっかり / とか $HOME とかにすると悲劇になるので、そこは十分に注意する必要があります。ユーザーフォルダやシステムフォルダのうち消せるものは全部消しますしね。そのあたりは備忘録として残しているだけなので、消えても筆者は責任を負いません。



2019年7月31日 @kimipooh

0 件のコメント: