Запустите скрипт bash для автоматического копирования содержимого с USB-устройства после подключения USB-устройства - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть сценарий 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 внутри папки Test с символом блокировки.Когда я удаляю% s и просто использую

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

Это дает мне [Errorno 17] file exists.

Это скрипт bash ( copy.sh ), который я хочудля запуска при подключенном устройстве USB.

#!/bin/sh

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

# echo "My message" > /var/www/html/thisisaverylongfilename.txt #This works

Таким образом, команда python не работает, а команда echo работает, когда я подключаю USB.

Вот строка, которую я добавил в / etc / udev / rules.d / test.rules

ACTION=="add",KERNEL=="sdb*", RUN+="/var/www/html/copy.sh"

Это потому, что USB-накопитель не готов к работе при запуске сценария bash?

  1. Как скопировать содержимое USB-накопителя в обычную папку, а не в% s?
  2. Как на самом деле скопировать содержимое?

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Чтобы не использовать% s, вы можете использовать метод формата.

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

Вы можете использовать любое имя в фигурных скобках, которое создаст ключевые аргументы формата.Вы также можете использовать числа, которые преобразуются в позиционные аргументы.Пример:

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

copytree из shutil также требует, чтобы пункт назначения не существовал.Поэтому вам нужно будет проверить, существует ли пункт назначения, и удалить его, если он существует.Для этого вы можете использовать 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)
0 голосов
/ 01 марта 2019

Решение для 1: Как скопировать содержимое USB-накопителя в обычную папку, а не в% s?

Я сделал это, чтобы работать с Ответ Этана .

Решение для 2: Как мне на самом деле скопировать содержимое?

Хорошо, так что я узнал о 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-устройства будет автоматически скопировано в целевой пункт назначения после его подключения.

0 голосов
/ 28 февраля 2019

Дайте полный путь Python, как:

/usr/bin/python /var/www/html/copy_flash.py
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...