Как автоматически определять и записывать в 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 $? 

  • Как поместить команду EOF в одну строку для выполнения нескольких команд оболочки
  • Как я могу предоставить все разрешения для файла для одного пользователя, а не я?
  • Производительность скрипта Bash
  • Bash работает с несколькими программами и закрывается
  • Проблема bc о длинном выражении
  • Как передать список переменных в sed в функции оболочки
  • Чтобы настроить скрипт для отправки электронной почты только тогда, когда команда diff дает разницу
  • ftp и shebang
  • 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 $? 
    Linux и Unix - лучшая ОС в мире.