GNU/Linux >> Linux の 問題 >  >> Ubuntu

USB(フラッシュ)ドライブのコンテンツを別のディレクトリに自動的にコピーするにはどうすればよいですか?

USBフラッシュドライブのコンテンツをホームディレクトリの定義済みフォルダに自動的にコピーするようにUbuntuをプログラムしたい。

のときに自動的にこれを実行したい フラッシュドライブが接続されています(特定のドライブだけではありません)。

承認された回答:

以下のスクリプトは、このスクリプトの反対の変形です。その1つは指定されたに作用します ドライブの場合、このスクリプトはすべてのを除くすべてに作用します 指定された(usb)ドライブ。

機能

  • 外部USBストレージデバイスが接続されているときはいつでも、スクリプトはそのコンテンツをユーザーが定義したディレクトリにコピーします(スクリプトのヘッドセクション:target_folder = )。サブディレクトリは、コピー元のドライブの名前で作成されます。
  • ターゲットフォルダ(ディスクのコンテンツの以前のコピー)が存在する場合、それは以前のコピーを上書きします。
  • エントリを追加しましたexcluded = 、ここに「通常の」(永続的な)USBデバイスの名前をリストできます(おそらくそうすべきです)(「通常の」ドライブはすでに自動的に除外されています)。 Ubuntuは主にファイルシステムによってデバイスのタイプを定義しているようです。フラッシュドライブをext4としてフォーマットすることをテストしました 、フラッシュドライブではなく「通常の」ドライブとして表示されました。

スクリプト

#!/usr/bin/env python3

import subprocess
import time
import shutil

#--
target_folder = "/path/to/target_folder"
excluded = ["media_extern"]
#--

def get_mountedlist():
    return [(item.split()[0].replace("├─", "").replace("└─", ""),
             item[item.find("/"):]) for item in subprocess.check_output(
            ["/bin/bash", "-c", "lsblk"]).decode("utf-8").split("n") if "/" in item]

def identify(disk):
    command = "find /dev/disk -ls | grep /"+disk
    output = subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")
    if "usb" in output:
        return True
    else:
        return False

done = []
while True:
    mounted = get_mountedlist()
    new_paths = [dev for dev in get_mountedlist() if not dev in done and not dev[1] == "/"]
    valid = [dev for dev in new_paths if (identify(dev[0]), dev[1].split("/")[-1]  in excluded) == (True, False)]
    for item in valid:
        target = target_folder+"/"+item[1].split("/")[-1]
        try:
            shutil.rmtree(target)
        except FileNotFoundError:
            pass
        shutil.copytree(item[1], target)
    done = mounted
    time.sleep(4)

使用方法

スクリプトを空のファイルにコピーします。ヘッドセクションで、次のように設定します。

  • 挿入したフラッシュドライブのコピーを保存する場所へのパス

    target_folder = "/path/to/directory"
    
  • 永続的に接続されている可能性のあるデバイスの名前(lsblkを使用) わからない場合)

    excluded = ["media_extern", "<some_other_drive>"]
    

    たとえば

    sdb      8:16   1   471M  0 disk 
    └─sdb1   8:17   1   471M  0 part /media/jacob/19C3-0A41
    sdc      8:32   0 698,6G  0 disk 
    └─sdc1   8:33   0 698,6G  0 part /media/jacob/media_extern
    sr0     11:0    1  1024M  0 rom  
    

    私のlsblkの出力で 、2つのデバイスがあります:19C3-0A41 およびmedia_extern 。最後の1つは、除外したい永続的に接続されているディスクです:

    excluded = ["media_extern"]
    

スクリプトをcopy_flash.pyとして保存します 、実行者:

python3 /path/to/copy_flash.py

必要に応じて、スタートアップアプリケーションに追加します。[ダッシュ]>[スタートアップアプリケーション]>[追加]

関連:Ubuntuでメールアイコンインジケータアプレットを削除する方法は?
Ubuntu
  1. 大量のファイルをUSBフラッシュドライブにコピーできないのはなぜですか?

  2. LinuxでUSBフラッシュドライブをマウントする方法

  3. あるディレクトリから別のディレクトリに最新の上位 10 個のファイルをコピーする方法は?

  1. USBフラッシュドライブが挿入されたときにC++プログラムを実行する方法は?

  2. Ubuntu 18.04で現在のディレクトリのパスをコピーする方法は?

  3. ターミナル出力をコピーするには?

  1. Ubuntu18.04LTSでUSBドライブを暗号化する方法

  2. USB フラッシュ ドライブに起動可能な Memtest86+ を作成する方法は?

  3. Linuxでディレクトリの内容が変更されたときにスクリプトを自動的に実行する方法は?