Я пытаюсь научиться использовать bash
скрипты; я искал ответы в Google, но не могу найти ответа на свою проблему.
Скрипт выглядит так:
#!/bin/bash
TIME=`date +%b-%d-%y`
FILENAME=backup-$TIME.tar.gz
DESDIR=home/pi/backups
SRC=home/pi/backuplist.txt
find -iname '*.orig' -o -iname '*.py' > home/pi/backuplist.txt
tar -zcvf $DESDIR/$FILENAME $SRC
когда я запускаю это, оно не создает, backuplist.txt
поэтому нет результата, который можно было бы использовать tar
.
Я попробовал использовать find -iname
его напрямую tar
в конвейере, но получил только ответ -iname command does not exist
.
Когда я find
сначала вывожу данные в терминал, а потом использую, tar
это работает.
Что я делаю не так?
решение1
В этом скрипте есть две основные проблемы:
Пути являются относительными. Это означает, что когда вы запускаете его, предполагается, что
home/pi
существует вТекущий каталог. У меня такое чувство, что все упоминанияhome/pi
в скрипте следует заменить на/home/pi
.Команда
tar
, вероятно, предназначена для резервного копирования файлов вbackuplist.txt
файле. В том виде, в котором она написана сейчас, вы получитеtar
архив, содержащийbackuplist.txt
сам файл и ничего больше. Если вы хотели прочитатьсодержаниеэтого файла используйтеtar -zcvf "$DESDIR/$FILENAME" -T "$SRC"
.В скрипте также есть переменные без кавычек.
Вот что, я думаю, вам нужно:
#!/bin/bash
TIME="$(date +%b-%d-%y)"
FILENAME="backup-$TIME.tar.gz"
DESDIR="/home/pi/backups"
SRC="/home/pi/backuplist.txt"
find /home/pi -iname '*.orig' -o -iname '*.py' >"$SRC"
tar -zcvf "$DESDIR/$FILENAME" -T "$SRC"
В /home/pi
командной find
строке — это дикая догадка. Без нее, я предполагаю, GNU find
использовал бы текущий каталог.
решение2
Я думаю, что этот немного другой скрипт удовлетворит ваше первоначальное желание передать список файлов непосредственно в tar
.
Я заключил переменные в кавычки там, где они используются, и заменил обратные кавычки `...`
современной $(...)
конструкцией.
Наконец, я предположил, что вы хотите, чтобы это запускалось из /
, чтобы используемые вами пути могли существовать.
#!/bin/bash
WHEN=$(date +%b-%d-%y)
FILENAME="backup-$WHEN.tar.gz"
DESDIR=/home/pi/backups
SRC=/home/pi/backuplist.txt
mkdir -p "$DESDIR"
cd /
find -iname '*.orig' -o -iname '*.py' |
tee "$SRC" |
tar zcvf "$DESDIR/$FILENAME" --no-recursion --verbatim-files-from --files-from -
Вы можете полностью опустить две строки, ссылающиеся на файл, $SRC
если вам не нужно создавать список файлов в процессе резервного копирования.