Comando buscar y tar en script

Comando buscar y tar en script

Estoy intentando escribir un script que requiera la interacción del usuario. Básicamente, el script tiene que preguntar al usuario acerca de 3 parámetros: nombre del archivo que el usuario desea encontrar, el número de días durante los cuales se modificaron los archivos y el nombre del archivo tar. Cuando se conocen todos los parámetros, el script debe encontrar los archivos apropiados y convertirlos en un archivo con un nombre determinado. Cuando escribo un solo comando en la terminal:

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

funciona bien. ¿Cómo puedo utilizar una variable ingresada por un usuario para invocar el comando que está en el mismo script? Mi script está creando un archivo vacío.

Mi guión:

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 -

Respuesta1

Intente eliminar las 'comillas adicionales en'"$nameoffile"'

Ejemplo:

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

Si necesita comillas simples, escápelas así:

echo \'$nameoffile\'
'myFile'

Respuesta2

En general, necesitar la interacción del usuario es una muy mala idea. hace que su secuencia de comandos sea imposible de automatizar y hace que sea muy difícil de usar para sus usuarios, ya que necesitan escribir cosas manualmente en un entorno que no permite completar con pestañas.

Desde @maulinglawnsya explicadoPor qué fallaba su script, le daré una forma más sencilla de hacerlo que no requiere que sus usuarios escriban información laboriosamente:

#!/usr/bin/env sh

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

Luego, para buscar archivos con el nombre foo.txt, modificados en los últimos 3 días y archivarlos en bar.tar.gz`, ejecutaría:

script.sh 3 foo.txt bar

También puede agregar una simple verificación de errores para garantizar que el script siempre se ejecute con la cantidad correcta 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 -

Respuesta3

read admite nombres de variables, por ejemplo;

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

información relacionada