Python 在USB设备装载后,运行bash脚本自动从USB设备复制内容

Python 在USB设备装载后,运行bash脚本自动从USB设备复制内容,python,bash,ubuntu,Python,Bash,Ubuntu,我有一个python脚本,可以将所有文件从USB存储设备复制到Ubuntu机器中的目标文件夹。我以前从未用Python编程 import os import shutil from shutil import copytree, ignore_patterns files = os.listdir('/media/user/HP drive') destination = '/home/user/Documents/Test/%s' try : for f in files:

我有一个python脚本,可以将所有文件从USB存储设备复制到Ubuntu机器中的目标文件夹。我以前从未用Python编程

import os
import shutil
from shutil import copytree, ignore_patterns

files = os.listdir('/media/user/HP drive')

destination = '/home/user/Documents/Test/%s'
try :
    for f in files:
        source = '/media/user/HP drive/%s' % f
        copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))    
except Exception as e:
    print(e)
上面的脚本运行正常,但它在测试文件夹中创建了一个带有锁符号的文件夹
%s
。当我删除%s并仅使用

destination = '/home/user/Documents/Test/'
它给我提供了
[Errorno 17]文件

这是我希望在安装USB设备时运行的bash脚本(copy.sh

#!/bin/sh

python /var/www/html/copy_flash.py    #This doesn't work.

# echo "My message" > /var/www/html/thisisaverylongfilename.txt #This works
因此,python命令不起作用,但当我插入USB时,echo命令起作用

这是我在/etc/udev/rules.d/test.rules

ACTION=="add",KERNEL=="sdb*", RUN+="/var/www/html/copy.sh"
是因为bash脚本运行时USB驱动器未准备好吗

  • 如何将USB驱动器内容复制到常规文件夹而不是%s中
  • 我如何实际复制内容

  • 给出python的完整路径,如:

    /usr/bin/python /var/www/html/copy_flash.py
    

    为了不使用%s,您可以使用format方法

    source = '/media/users/HP/{path}'.format(path=your_filename_here)
    
    您可以使用大括号中的任何名称来创建format的关键字参数。还可以使用转换为位置参数的数字。 例如:

    'Hello {0}! Good {1}'.format('DragonBorn', 'Evening!')
    
    来自shutil的copytree还要求目标不存在。因此,您需要检查目标是否存在,如果存在,则将其删除。您可以使用os.rmdir和os.path.exists进行此操作。shutil也可能具有等效功能

    您可以通过以下方式执行此检查并复制树:

    if os.path.exists(destination):
        if os.listdir(): # If the directory is not empty, do not remove.
            continue
        os.rmdir(destination)
    shutil.copytree(source, destination)
    
    如果要删除目录下的整个树,可以使用shutil.rmtree()


    1的解决方案:如何将USB驱动器内容复制到常规文件夹而不是%s中?

    我是从家里来上班的

    第二种解决方案:如何实际复制内容?

    好的,我从中了解到了systemd,它比udev规则的优点是,脚本在装载后真正启动,而不是在添加系统设备后启动,这就是为什么我的python脚本无法复制文件的原因,因为脚本是在设备实际装载之前运行的

    我删除了文件/etc/udev/rules.d/test.rules

    ACTION=="add",KERNEL=="sdb*", RUN+="/var/www/html/copy.sh"
    
    并在/etc/systemd/system/copy.service中创建了一个新文件,内容如下:

    [Unit]
    Description=My flashdrive script trigger
    Requires=media-YourMediaLabel.mount
    After=media-YourMediaLabel.mount
    
    [Service]
    ExecStart=/home/you/bin/triggerScript.sh
    
    [Install]
    WantedBy=media-YourMediaLabel.mount
    
    运行此命令
    sudo systemctl list units-t mount
    。找到您的设备并将介质更换为MediaLabel。用设备单元安装上面的

    然后,您必须启动/启用该服务:

    sudo systemctl start copy.service
    sudo systemctl enable copy.service
    

    就这样。安装USB设备后,它的内容将自动复制到目标位置。

    否不起作用。当我从终端运行bash脚本时,同样的命令正在运行
    /var/www/html/copy.sh
    谢谢。是的,它现在可以按照我的想法工作了,除了我的第二个问题,我已经找到了答案,我将添加它
    #!/bin/sh
    
    python /var/www/html/copy_flash.py    #This doesn't work.
    
    # echo "My message" > /var/www/html/thisisaverylongfilename.txt #This works