
Я помогаю своей девушке с мероприятием, в ходе которого ей нужно загрузить около 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
Цифры могут быть ненадежными. Если вы вставите одну и ту же палочку дважды, она будет засчитана дважды.