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

2019年7月12日金曜日

macOS のリカバリーモードで USB Ethernet アダプタ(LANアダプタ)を認識させる方法

macOS のOS再インストールは、リカバリーモード(Command + r を押しながら起動)から行います。途中で認証のためにネット接続が必要です。どうやら標準搭載されているデバイスでしか GUI によるネット接続をサポートしていないのか、手持ちの MacBookAir では Wi-Fi しか認識しません。WPA の Enterprise 認証の場合、どうやら接続ができないようなのです(接続エラーになる)。手持ちのUSB Ethernet LAN アダプタを接続してもネット接続できません。そうした場合に networksetup コマンドで手動認識させる方法を見つけたので紹介します。

試した環境


  • macOS 10.14.5
  • MacBookAir 13inch 

参考情報



1. リカバリーモードで networksetup コマンドを利用するには


networksetup コマンドは /usr/sbin/networksetup に入っています。しかしながら、

リカバリーモードにはこのコマンドが入っていません。そのため、

  1. リカバリーモードでディスクユーティリティを開き、内蔵HDD(SSD)をマウントする(内蔵HDDの名前が「Macintosh HD」と仮定します)
  2. ディスクユーティリティを終了し、ターミナルを開きます
  3. /Volumes/Macintosh\ HD/usr/sbin/networksetup  -listallhardware とタイプして Enterキーを押します。MacBookAirの場合には
     Hardware Port:  Wi-fi
     Device: en0
     Ethernet Address: *****

     Hardware Port:  Thunderbolt 1
     Device: en1
     Ethernet Address: *****

     Hardware Port:  Thunderbolt Bridge
     Device: bridge0
     Ethernet Address: *****

    の3つが出てきました。
  4. /Volumes/Macintosh\ HD/usr/sbin/networksetup  -listnetworkserviceorder とタイプしてEnterキーを押します。
     (1) Wi-Fi
     (2) Thunderbolt Bridge

    の2つが出てきます。つまりはこれが認識されているハードウェアのうち、有効なデバイスということです。

ということで、内蔵HDDの networksetup コマンドを間借りするということになります。


2. Apple USB Ethernet Adapter を Mac に接続し、LAN接続する


  1. 物理的に USB Ethernet Adapter をMacに接続して、さらにLANケーブル経由でLAN ネットワークに接続します。
  2. /Volumes/Macintosh\ HD/usr/sbin/networksetup  -listallhardware とタイプして Enterキーを押します。MacBookAirの場合には
     Hardware Port:  Apple USB Ethernet Adapter
     Device: en2
     Ethernet Address: *****


     Hardware Port:  Wi-fi
     Device: en0
     Ethernet Address: *****

     Hardware Port:  Thunderbolt 1
     Device: en1
     Ethernet Address: *****

     Hardware Port:  Thunderbolt Bridge
     Device: bridge0
     Ethernet Address: *****

    *以後、Apple USB Ethernet Adapter がMacが認識した devicename(デバイス名)になり、コマンドで使うことになります。これはアダプタによって名称が違います。沢山あってわからない場合には、そのアダプタを抜いた場合と接続した場合の両方で、このハードウェア一覧表示コマンドを使って違いをチェックして確認してください。
  3. /Volumes/Macintosh\ HD/usr/sbin/networksetup  -listnetworkserviceorder とタイプしてEnterキーを押します。
     (1) Wi-Fi
     (2) Thunderbolt Bridge

    のようにハードウェアとしては認識していますが、それが使える状態にありません。

3. Apple USB Ethernet Adapter を認識させる


  1.  /Volumes/Macintosh\ HD/usr/sbin/networksetup  -detectnewhardware とタイプしてEnterキーを押します。  
  2. /Volumes/Macintosh\ HD/usr/sbin/networksetup  -listnetworkserviceorder とタイプしてEnterキーを押します。
     (1) USB Ethernet Adapter
     (2) Wi-Fi
     (3) Thunderbolt Bridge
のように自動認識でうまく認識してくれたらOKです。

4. ネット接続できるか確認する


  1. ifconfig en2 up とタイプして Enterキーを押します。
     *念の為、ifconfig(リカバリーモードで利用できる)で、Apple USB Ethernet Adapter( Device: en2で認識されている )をアクティブにしておきます(アクティブになっていると思いますが)
  2. ifconfig en2 とタイプして Enterキーを押します。
    flags=数字 <UP, BROADCAST, ....> のところに UPが入っていること
    inet6  IPアドレス(IPv6)
    inet IPアドレス(IPv4)
    のいずれか利用しているネットワークで意図したIPアドレスが入っていることを確認する
    <うまくいかない場合>
    • *もしDHCPでのIP自動取得が出来る状況にもかかわらず、出来ないなら /Volumes/Macintosh\ HD/usr/sbin/networksetup -setdhcp "USB Ethernet Adapter"
      としてDHCPによる取得設定を試してみてください。
    • *もし固定IPアドレスの場合には
       /Volumes/Macintosh\ HD/usr/sbin/networksetup -setmanual "USB Ethernet Adapter"  IPアドレス  サブネットマスク IPアドレスで設定します。
  3. ping   www.yahoo.co.jp
    などインターネット越しのサーバーと通信できるか確認する
    nslookup や dig を使いたいなら、
    /Volumes/Macintosh\ HD/usr/bin/nslookup  等にあるので、使って確認してみる

ということで利用できるかどうか分かります。

5. プロキシ設定を確認する、設定する(必要なら)


透過プロキシやプロキシなしで接続できるならプロキシ設定は不要ですが、プロキシ設定をしないと接続できない場合もあるでしょう。
  •  /Volumes/Macintosh\ HD/usr/sbin/networksetup -getwebproxy "USB Ethernet Adapter"
    Enabled: Yes
    Server: *******
    Port: 8080
    Authenticated Proxy Enabled: 0
上記コマンドでもし、プロキシが有効なら上記のように設定が出てくるでしょう。リカバリーモードだと全部OFFがデフォルトじゃないかなと思います。
  •  /Volumes/Macintosh\ HD/usr/sbin/networksetup -setwebproxy "USB Ethernet Adapter"  <domain> <port number> <authenticated> <username> <password>
がマニュアルになりますので、
  • Server: proxy.example.com
  • Port: 8080
  • ユーザー認証なし
だと仮定するから
  •  /Volumes/Macintosh\ HD/usr/sbin/networksetup -setwebproxy "USB Ethernet Adapter"  proxy.example.com  8080
になりますね。
  • /Volumes/Macintosh\ HD/usr/sbin/networksetup -setwebproxystate "USB Ethernet Adapter" on
として設定したプロキシを有効にしておく必要があります。もしセキュアプロキシだと、setsecurewebproxy オプションの方を使うみたいですね。
現時点で下記のようなコマンドの種類があるので、いろいろ見てみると良いと思います。
  • Usage: networksetup -getftpproxy <networkservice>
  • Usage: networksetup -setftpproxy <networkservice> <domain> <port number> <authenticated> <username> <password>
  • Usage: networksetup -setftpproxystate <networkservice> <on off>
  • Usage: networksetup -getwebproxy <networkservice>
  • Usage: networksetup -setwebproxy <networkservice> <domain> <port number> <authenticated> <username> <password>
  • Usage: networksetup -setwebproxystate <networkservice> <on off>
  • Usage: networksetup -getsecurewebproxy <networkservice>
  • Usage: networksetup -setsecurewebproxy <networkservice> <domain> <port number> <authenticated> <username> <password>
  • Usage: networksetup -setsecurewebproxystate <networkservice> <on off>
  • Usage: networksetup -getstreamingproxy <networkservice>
  • Usage: networksetup -setstreamingproxy <networkservice> <domain> <port number> <authenticated> <username> <password>
  • Usage: networksetup -setstreamingproxystate <networkservice> <on off>
  • Usage: networksetup -getgopherproxy <networkservice>
  • Usage: networksetup -setgopherproxy <networkservice> <domain> <port number> <authenticated> <username> <password>
  • Usage: networksetup -setgopherproxystate <networkservice> <on off>
  • Usage: networksetup -getsocksfirewallproxy <networkservice>
  • Usage: networksetup -setsocksfirewallproxy <networkservice> <domain> <port number> <authenticated> <username> <password>
  • Usage: networksetup -setsocksfirewallproxystate <networkservice> <on off>
  • Usage: networksetup -getproxybypassdomains <networkservice>
  • Usage: networksetup -setproxybypassdomains <networkservice> <domain1> [domain2] [...]
  • Usage: networksetup -getproxyautodiscovery <networkservice>
  • Usage: networksetup -setproxyautodiscovery <networkservice> <on off>
  • Usage: networksetup -setautoproxyurl <networkservice> <url>
  • Usage: networksetup -getautoproxyurl <networkservice>
  • Usage: networksetup -setautoproxystate <networkservice> <on off>

2019年7月12日 @kimipooh