Что я делаю не так при использовании find -name с tar в скрипте bash?

Что я делаю не так при использовании find -name с tar в скрипте bash?

Я пытаюсь научиться использовать 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

В этом скрипте есть две основные проблемы:

  1. Пути являются относительными. Это означает, что когда вы запускаете его, предполагается, что home/piсуществует вТекущий каталог. У меня такое чувство, что все упоминания home/piв скрипте следует заменить на /home/pi.

  2. Команда tar, вероятно, предназначена для резервного копирования файлов в backuplist.txtфайле. В том виде, в котором она написана сейчас, вы получите tarархив, содержащий backuplist.txtсам файл и ничего больше. Если вы хотели прочитатьсодержаниеэтого файла используйте tar -zcvf "$DESDIR/$FILENAME" -T "$SRC".

  3. В скрипте также есть переменные без кавычек.

Вот что, я думаю, вам нужно:

#!/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если вам не нужно создавать список файлов в процессе резервного копирования.

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