Comando find e tar no script

Comando find e tar no script

Estou tentando escrever um script que requer interação do usuário. Basicamente, o script deve perguntar ao usuário cerca de 3 parâmetros: nome do(s) arquivo(s) que o usuário deseja encontrar, o número de dias durante os quais o(s) arquivo(s) foram modificados e o nome de um arquivo tar. Quando todos os parâmetros forem conhecidos, o script deve encontrar os arquivos apropriados e transformá-los em um arquivo com um determinado nome. Quando escrevo um único comando no terminal:

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

funciona bem. Como posso usar uma variável inserida por um usuário para invocar o comando que está no mesmo script? Meu script está criando um arquivo vazio.

Meu roteiro:

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 -

Responder1

Tente remover as 'aspas extras em'"$nameoffile"'

Exemplo:

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

Se você precisar de aspas simples, escape-as assim:

echo \'$nameoffile\'
'myFile'

Responder2

Em geral, precisar da interação do usuário é uma péssima ideia. isso torna seu script impossível de automatizar e torna muito difícil o uso dos usuários, pois eles precisam digitar as coisas manualmente em um ambiente que não permite o preenchimento de guias.

Desde @maulinglawnsjá explicadopor que seu script estava falhando, darei a você uma maneira mais simples de fazer isso, que não exige que seus usuários digitem informações laboriosamente:

#!/usr/bin/env sh

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

Então, para encontrar arquivos nomeados foo.txt, modificados nos últimos 3 dias e arquivá-los em bar.tar.gz`, você executaria:

script.sh 3 foo.txt bar

Você também pode adicionar uma verificação simples de erros para garantir que o script seja sempre executado com o número correto de parâmetros:

#!/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 -

Responder3

read suporta nomear variáveis, por exemplo;

#!/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 -

informação relacionada