Python 在USB设备装载后,运行bash脚本自动从USB设备复制内容
我有一个python脚本,可以将所有文件从USB存储设备复制到Ubuntu机器中的目标文件夹。我以前从未用Python编程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:
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驱动器未准备好吗
给出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