Как автоматически определять и записывать в usb с переменными пространствами в его имени

Я делаю второе упражнение BASH из руководства по написанию сценариев TLDP Bash , и большинство из них выяснилось до тех пор, пока не пришло время скопировать сжатые файлы на вставленный USB.

Список домашних каталогов

Выполните рекурсивный список каталогов в домашнем каталоге пользователя и сохраните информацию в файле. Сжатие файла, попросите сценарий попросить пользователя вставить USB-накопитель, затем нажмите ENTER. Наконец, сохраните файл на флеш-накопитель после того, как убедитесь, что флешка правильно смонтирована путем анализа вывода df. Обратите внимание, что флэш-диск должен быть размонтирован до его удаления.

По мере того, как я продвигаюсь по сценарию, он становится все меньше и более интересным, и было интересно, есть ли лучший способ сделать это. Я знаю, что создание файлов, скорее всего, не самый эффективный способ выполнения сравнений, но пока еще не имеет расширений оболочки и намеревается изменить их, как только я его заработаю.

В частности, проблема заключается в том, что USB-порт монтируется и что я пишу на USB и нигде больше. Я сравниваю последнюю строку df после того, как USB подключен к последней строке df от diff между df прежде чем USB будет подключен, а df после подключения USB и зацикливания до тех пор, пока они не совпадут. К сожалению, результат diff начинается с a>, но я намерен использовать sed, чтобы избавиться от этого. Реальная проблема – это путь, по которому монтируется мой USB:

/ media / flerb / "Название USB с пробелами"

Сделать этот переносимый USB-носитель, который может иметь разные имена, является лучшим выбором здесь, чтобы что-то сделать с помощью awk и разделителей полей? И в качестве продолжения, я знаю, что это довольно неэлегантно и интересно, есть ли более чистый способ сделать это … особенно потому, что это второе упражнение и все еще в EASY.

Выход из хвостов df:

 /dev/sdb1 15611904 8120352 7491552 53% /media/flerb/CENTOS 7 X8 > /dev/sdb1 15611904 8120352 7491552 53% /media/flerb/CENTOS 7 X8 

Сценарий до сих пор

  1 #!/bin/bash 2 3 if [ "$UID" -eq 0 ] ; then 4 echo "Don't run this as root" 5 exit 1 6 fi 7 8 #Create a backup file with the date as title in a backup directory 9 BACKUP_DIR="$HOME/backup" 10 DATE_OF_COPY=$(date --rfc-3339=date) 11 BACKUP_FILE="$BACKUP_DIR/$DATE_OF_COPY" 12 13 [ -d "$BACKUP_DIR" ] || mkdir -m 700 "$BACKUP_DIR" 14 15 #find all files recursively in $HOME directory 16 find -P $HOME >> "$BACKUP_FILE" 17 18 #use lzma to compress 19 xz -zk --format=auto --check=sha256 --threads=0 "$BACKUP_FILE" 20 21 #making files to use in operations 22 BEFORE="$BACKUP_DIR"/before_usb.txt 23 AFTER="$BACKUP_DIR"/after_usb.txt 24 DIFFERENCE="$BACKUP_DIR"/difference.txt 25 26 df > "$BEFORE" 27 read -p 'Enter USB and press any button' ok 28 sleep 2 29 df > "$AFTER" 30 diff "$BEFORE" "$AFTER" > "$DIFFERENCE" 31 sleep 2 32 echo 33 34 TAIL_AFTER=$(tail -n 1 "$AFTER") 35 TAIL_DIFF=$(tail -n 1 "$DIFFERENCE") 36 37 until [ "$TAIL_AFTER" == "$TAIL_DIFF" ] ; 38 do 39 echo "Not yet" 40 df > "$AFTER" 41 TAIL_AFTER=$(tail -n 1 "$AFTER") 42 diff "$BEFORE" "$AFTER" > "$DIFFERENCE" 43 TAIL_DIFF=$(tail -n 1 "$DIFFERENCE") 44 echo "$TAIL_AFTER" 45 echo "$TAIL_DIFF" 46 sleep 1 47 48 done 49 exit $? 

One Solution collect form web for “Как автоматически определять и записывать в usb с переменными пространствами в его имени”

Чтобы получить правильный USB и его путь:

  • заметил, что первый подключенный к моей системе USB подключен к файловой системе / dev / sdb1, а второй подключен к файловой системе / dev / sdc1. Я добавил раздел для переключения на / dev / sdc1, если udevadm info -q all -n "/dev/sdb" | grep "ID_BUS=usb" udevadm info -q all -n "/dev/sdb" | grep "ID_BUS=usb" вернётся.

  • если diff между df --output=target | grep "/media/darren" df --output=target | grep "/media/darren" до и после имеет "/ media / darren" в нем, это, по-видимому, новый USB. USB установлен.

  • if udevadm info -q all -n "/dev/sdb" | grep "ID_BUS=usb if udevadm info -q all -n "/dev/sdb" | grep "ID_BUS=usb истинно, тогда устройство, установленное на" / dev / sdb ", является устройством USB

  • чтобы получить путь, и убедитесь, что я хватаю правильный: df --output=source,avail,target | grep "$FILESYSTEM" | grep "$MOUNTPOINT" df --output=source,avail,target | grep "$FILESYSTEM" | grep "$MOUNTPOINT" df --output=source,avail,target | grep "$FILESYSTEM" | grep "$MOUNTPOINT" и некоторые действительно приятные awk

     udevadm info -q all -n "$FILESYSTEM" | grep "ID_BUS=usb" > $RESULT USB_ADDR="$BACKUP_DIR"/usb_addr.txt if grep "ID_BUS=usb" "$RESULT" ; then df --output=source,avail,target | grep "$FILESYSTEM" | grep "$MOUNTPOINT" > "$USB_ADDR" awk -i inplace '{$0=gensub(/\s*\S+/,"",1)}1' "$USB_ADDR" awk -i inplace '{$0=gensub(/\s*\S+/,"",1)}1' "$USB_ADDR" sed -i 's/^ *//' "$USB_ADDR" 

К сожалению, не удастся, если другие вещи добавлены или удалены. Но, по крайней мере, это плохо получается, если он захватывает неправильное устройство при использовании отфильтрованного вывода df и grepping для файловой системы и точки монтирования.

Пробовал awk 'NR!=1{print $NF}' <(df)|sort . Все еще не велика по расширению bash.

 #!/bin/bash if [ "$UID" -eq 0 ] ; then echo "Don't run this as root" exit 50 fi #Create a backup file with the date as title in a backup directory BACKUP_DIR="$HOME/backup" DATE_OF_COPY=$(date --rfc-3339=date) BACKUP_FILE="$BACKUP_DIR/$DATE_OF_COPY" [ -d "$BACKUP_DIR" ] || mkdir -m 700 "$BACKUP_DIR" #find all files recursively in $HOME directory find -P $HOME >> "$BACKUP_FILE" #use lzma to compress xz -zk --format=auto --check=sha256 --threads=0 "$BACKUP_FILE" #making files to use in operations of before and after usb is inserted info and diff between them #this is part of how we will insure that we are writing to the correct device BEFORE="$BACKUP_DIR"/before_usb.txt AFTER="$BACKUP_DIR"/after_usb.txt DIFFERENCE="$BACKUP_DIR"/difference.txt #MOUNTPOINT=where computer mounts USBs by default MOUNTPOINT="/media/darren" FILESYSTEM="/dev/sdb" RESULT="$BACKUP_DIR"/result.txt #if there is something on the mountpoint before we plug in the usb, we want to know #so the new device is written to udevadm info -q all -n "$FILESYSTEM" | grep "ID_BUS=usb" > $RESULT if grep "ID_BUS=usb" "$RESULT" ; then FILESYSTEM="/dev/sdc" echo $FILESYSTEM fi df --output=target | grep $MOUNTPOINT > "$BEFORE" read -p 'Enter USB or hard drive and press any button' ok df --output=target | grep $MOUNTPOINT > "$AFTER" #dif them to find the new one diff "$BEFORE" "$AFTER" > "$DIFFERENCE" # Look in mountpoint in the difference between the before and after df outputs SEARCH_FOR_MOUNT=$(grep "$MOUNTPOINT" "$DIFFERENCE") until [ "$SEARCH_FOR_MOUNT" ] ; do df --output=target | grep $MOUNTPOINT > "$AFTER" diff "$BEFORE" "$AFTER" > "$DIFFERENCE" SEARCH_FOR_MOUNT=$(grep "$MOUNTPOINT" "$DIFFERENCE") done #check if new device plugged into filesystem is a USB udevadm info -q all -n "$FILESYSTEM" | grep "ID_BUS=usb" > $RESULT USB_ADDR="$BACKUP_DIR"/usb_addr.txt if grep "ID_BUS=usb" "$RESULT" ; then df --output=source,avail,target | grep "$FILESYSTEM" | grep "$MOUNTPOINT" > "$USB_ADDR" awk -i inplace '{$0=gensub(/\s*\S+/,"",1)}1' "$USB_ADDR" awk -i inplace '{$0=gensub(/\s*\S+/,"",1)}1' "$USB_ADDR" sed -i 's/^ *//' "$USB_ADDR" if [ ! -s $USB_ADDR ] ; then echo "Error finding USB Address" exit 100 ADDR=$(cat "$USB_ADDR") cp "$BACKUP_FILE.xz" "$ADDR" rm "$BACKUP_FILE" "$USB_ADDR" "$RESULT" "$BEFORE" "$AFTER" "$DIFFERENCE" else echo "Device is not a USB" exit 52 fi exit $? 
  • не выполняет то, что он должен делать?
  • Удерживать несколько пробелов, содержащих аргументы в одной переменной?
  • Используйте sed и sed самостоятельно, чтобы выполнить подстановку в строке, начинающейся с определенной строки, только если!
  • Как привести текст HEREDOC в переменную сценария оболочки?
  • Возьмите grep значение и выведите количество и значение вместе
  • Извлечь диапазон элементов из i-го элемента в j-й элемент, вплоть до n-го элемента из списка
  • Длина тестовой строки в файле
  • список графических процессов из терминала
  • Прокрутите все файлы в заданном подкаталоге, назовите вывод зацикленным файлом
  • Как сгенерировать много (пустых) файлов изображений?
  • Несколько команд sed в файле
  • Отключение соединения по событию
  • Interesting Posts

    Команда, которая может возвращать код ошибки в .bashrc

    Различные сайты на разных интерфейсах с использованием агрегации ссылок

    Внедрить собственную оболочку

    Как заставить Krusader показать реальный размер символических файлов?

    Как понять, почему Linux падает

    Как направить вывод журнала определенных единиц в определенный файл?

    Измерение скорости передачи USB-накопителя

    После перезагрузки сервер перестает реагировать

    Windows не загружается после установки Kali на другом жестком диске

    Как перейти в другой домен при вызове sudo?

    Как фильтровать линии, проходящие через трубу?

    Почему «ping -M do -s 8000» все еще работает между хостами с разными значениями MTU?

    make + bash: настройка переменных среды в командной строке не работает

    X -config оставляет пустой экран

    Ноутбук Manjaro внезапно не загрузит среду рабочего стола Xfce. Как загрузиться нормально?

    Linux и Unix - лучшая ОС в мире.