Команда find и tar в скрипте

Команда find и tar в скрипте

Я пытаюсь написать скрипт, требующий взаимодействия с пользователем. По сути, скрипт должен спрашивать пользователя о 3 параметрах: имя файла(ов), который пользователь хочет найти, количество дней, в течение которых файл(ы) были изменены, и имя архива tar. Когда все параметры известны, скрипт должен найти соответствующие файлы и сделать из них архив с заданным именем. Когда я пишу одну команду в терминал:

find -name 'zad*' -mtime -10 | tar -cvf archive.tar.gz -T -

работает хорошо. Как использовать переменную, введенную пользователем, для вызова команды, которая находится в том же скрипте? Мой скрипт создает пустой архив.

Мой сценарий:

echo "Enter a number of days"
read days
echo "Enter the name of file"
read nameoffile
echo "Enter the name of tar archive"
read nameofarchive
find -name '"$nameoffile"' -mtime -"$days" | tar -cvf "$nameofarchive".tar.gz -T -

решение1

Попробуйте удалить лишние 'кавычки в'"$nameoffile"'

Пример:

maulinglawns@debian-HP:~$ read nameoffile
myFile
maulinglawns@debian-HP:~$ echo '"$nameoffile"'
"$nameoffile"
maulinglawns@debian-HP:~$ echo "$nameoffile"
myFile

Если вам нужны одинарные кавычки, экранируйте их следующим образом:

echo \'$nameoffile\'
'myFile'

решение2

В целом, необходимость взаимодействия с пользователем — очень плохая идея. Это делает невозможным автоматизацию вашего скрипта и сильно затрудняет его использование пользователями, поскольку им приходится вручную вводить текст в среде, которая не поддерживает автодополнение клавишей Tab.

С @maulinglawnsуже объяснилпочему ваш скрипт не сработал, я дам вам более простой способ сделать это, не требующий от ваших пользователей трудоемкого ввода информации:

#!/usr/bin/env sh

days="$1"
nameoffile="$2"
nameofarchive="$3"
find -name "$nameoffile" -mtime -"$days" | tar -cvf $nameofarchive".tar.gz -T -

Затем, чтобы найти файлы с именем foo.txt, измененные за последние 3 дня, и заархивировать их в bar.tar.gz`, вам нужно выполнить:

script.sh 3 foo.txt bar

Вы также можете добавить простую проверку ошибок, чтобы гарантировать, что скрипт всегда запускается с правильным количеством параметров:

#!/usr/bin/env sh

if [ $# -ne 3 ]; then
    echo "You need to enter three arguments"
    exit 1
fi

days="$1"
nameoffile="$2"
nameofarchive="$3"
find -name "$nameoffile" -mtime -"$days" | tar -cvf $nameofarchive".tar.gz -T -

решение3

Например, read поддерживает именование переменных;

#!/bin/bash

read -p "How many files? (0-100) " VAR_NUMBER_OF_FILES
read -p "How many days? (0-100) " VAR_NUMBER_OF_DAYS
read -p "Tar file name? " VAR_TAR_NAME
...
find -name '"$VAR_NUMBER_OF_FILES"' -mtime -"$VAR_NUMBER_OF_DAYS" | tar -cvf "$VAR_TAR_NAME".tar.gz -T -

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