Comando find e tar no script

1

Estou tentando escrever um script que requer interação do usuário. Basicamente, o script tem que perguntar ao usuário cerca de 3 parâmetros: nome do (s) arquivo (s) que o usuário deseja localizar, o número de dias durante os quais o (s) arquivo (s) foi modificado e o nome de um arquivo tar. Quando todos os parâmetros são 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 script:

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 -
    
por Ensz 23.10.2016 / 13:25

3 respostas

0

Em geral, precisar de interação com o usuário é uma ideia muito ruim. Isso torna impossível automatizar seu script e torna muito difícil o uso dos usuários, já que eles precisam digitar manualmente as coisas em um ambiente que não permite a conclusão da tabulação.

Como o @maulinglawns já explicou porque o seu script estava falhando, darei a você uma maneira mais simples de fazê-lo isso não requer que seus usuários digitem informações com cuidado:

#!/usr/bin/env sh

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

Em seguida, para localizar os arquivos com o nome 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 algumas verificações de erros simples 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 -
    
por 23.10.2016 / 14:57
2

Tente remover as citações extras de ' 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'
    
por 23.10.2016 / 13:59
0

read suporta variáveis de nomenclatura, 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 -
    
por 23.10.2016 / 20:29