运行bash脚本以在USB设备挂载后自动从USB设备复制内容

时间:2019-02-28 11:06:52

标签: 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:
        source = '/media/user/HP drive/%s' % f
        copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))    
except Exception as e:
    print(e)

上面的脚本运行良好,但是它在Test文件夹内使用锁定符号创建了一个文件夹%s。当我删除%s并仅使用

destination = '/home/user/Documents/Test/'

它给了我[Errorno 17] file exists

这是我要在安装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

因此,当我插入USB时,python命令不起作用,但echo命令起作用。

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

中添加的行
ACTION=="add",KERNEL=="sdb*", RUN+="/var/www/html/copy.sh"

是因为运行bash脚本时USB驱动器尚未准备好吗?

  1. 如何将USB驱动器的内容复制到常规文件夹而不是%s中?
  2. 我实际上如何复制内容?

3 个答案:

答案 0 :(得分:2)

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

source = '/media/users/HP/{path}'.format(path=your_filename_here)

您可以在括号内使用任何名称,这些名称将创建格式的关键字参数。您也可以使用转换为位置参数的数字。 一个例子:

'Hello {0}! Good {1}'.format('DragonBorn', 'Evening!')
Shutil的

copytree也要求目标不存在。因此,您将需要检查目标位置是否存在,如果存在则将其删除。您可以为此使用os.rmdir和os.path.exists。 Shutil也可能具有同等功能。

https://docs.python.org/3.5/library/shutil.html#shutil.copytree

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

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()。​​

if os.path.exists(destination):
    shutil.rmtree(destination)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

我让它从Ethan's answer开始工作。

解决方案2:如何实际复制内容?

好吧,所以我从this answer中了解到 systemd ,它比 udev 规则具有的优势是脚本在挂载后才真正触发,而不是在添加后触发系统设备,这就是为什么我的python脚本无法复制文件的原因,因为该脚本在实际安装设备之前就已运行。

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

并在 /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。找到您的设备,并将上面的media-YourMediaLabel.mount替换为您的设备单元。

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

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

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