Применение

Применение

Я помогаю своей девушке с мероприятием, в ходе которого ей нужно загрузить около 1000 USB-флешек одним и тем же файлом.

Это довольно небольшой файл (всего несколько МБ), но самая утомительная часть — это собственно копирование файла.

Есть ли способ автоматически копировать файл на USB-флешку в момент ее вставки? Это бы очень облегчило ей работу.

Моя настольная ОС — Windows 10, но у меня есть доступ и к Linux. Я бы даже не отказался написать bash-скрипт для Linux, если бы это было проще.

решение1

В Ubuntu 16.04 USB-флешка монтируется в /media/$USER/LabelName, но можно управлять копированием файлов, не зная об этом. Грубый сценарий будет таким:-

#!/bin/bash
while sleep 1
do  [ -e /media/$USER/*/TheFile ] || cp TheFile /media/$USER/*/
    umount umount /media/$USER/*
    xmessage -center -timeout 3 "File copied - change disc"
done

Это просто для того, чтобы показать принцип. Одна вещь, которую вам нужно сделать, это убедиться, что ничего не смонтировано, /media/$USER/прежде чем вы начнете (если вы уже не смонтировали первый диск). Вы можете заменить TheFileпараметром или предустановленной переменной среды, но убедитесь, что он находится в вашем текущем каталоге, так что нет пути, иначе проверка его существования на диске уже не сработает.

Вероятно, вы можете сделать все это на диске Ubuntu Live без установки, но вам нужно будет проверить, где смонтированы флеш-накопители, и при необходимости изменить скрипт; также я не уверен, xmessageвключен ли он в Live-диск, поэтому вам может потребоваться его установить, если только вы не используете другой метод указания того, что диск необходимо заменить.

решение2

РасширениеОсновная идея AFH, предполагая, что ваша ОС Linux автоматически монтирует флэш-накопители в /media/$USER.

#! /bin/bash

src="$1"
target="$(basename "$src")"
counter=0

copyTo() {
    sleep 0.3 # wait for drive to be fully mounted
    printf -v offset '%*s' $(( counter * 15 % ($(tput cols) - 15) ))
    echo "$offset Copy to $counter"
    cp "$src" "$1/$target"
    sync "$1"
    umount "$1"
    echo "$offset Unmounted $counter"
}

inotifywait -me create --format "%w%f" "/media/$USER" |
while IFS='' read -r drive; do
    ((++counter))
    copyTo "$drive" &
done

Применение

  • Установите inotifywait, если вы этого еще не сделали. В Ubuntu используйте sudo apt install inotify-toolsдля этого.
  • Настройте свой файловый менеджер (например, nemo или nautilus) нанетавтоматически открывать смонтированные диски. umountможет произойти сбой, если в окне файлового менеджера отображается содержимое диска, который необходимо размонтировать.
  • Сохраните скрипт как autocopy.sh.
  • Сделайте скрипт исполняемым с помощьюchmod u+x autocopy.sh
  • Запустите скрипт, используя./autocopy.sh '/path/to/file.ext'
  • Вставьте столько USB-флешек, сколько хотите. Скрипт обнаруживает диски по мере их подключения, копирует на них файл и отключает их.
  • По завершении нажмите , CtrlCчтобы выйти из скрипта.

Выход

Скрипт печатает перед копированием файлов и после размонтирования дисков. Связанные сообщения располагаются на том же уровне.

Copy to 1
Unmounted 1
               Copy to 2
                              Copy to 3
                              Unmounted 3
               Unmounted 2
                                             Copy to 4
                                             Unmounted 4

Цифры могут быть ненадежными. Если вы вставите одну и ту же палочку дважды, она будет засчитана дважды.

Связанный контент