Befehle „find“ und „tar“ im Skript

Befehle „find“ und „tar“ im Skript

Ich versuche, ein Skript zu schreiben, das eine Benutzerinteraktion erfordert. Im Wesentlichen muss das Skript den Benutzer nach drei Parametern fragen: dem Namen der Datei(en), die der Benutzer finden möchte, der Anzahl der Tage, an denen die Datei(en) geändert wurden, und dem Namen eines Tar-Archivs. Wenn alle Parameter bekannt sind, muss das Skript die entsprechenden Dateien finden und sie in ein Archiv mit einem bestimmten Namen umwandeln. Wenn ich einen einzelnen Befehl in das Terminal schreibe:

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

es funktioniert gut. Wie kann ich eine von einem Benutzer eingegebene Variable verwenden, um den Befehl aufzurufen, der sich im selben Skript befindet? Mein Skript erstellt ein leeres Archiv.

Mein Skript:

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 -

Antwort1

Versuchen Sie, die zusätzlichen 'Anführungszeichen zu entfernen in'"$nameoffile"'

Beispiel:

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

Wenn Sie einfache Anführungszeichen benötigen, maskieren Sie diese wie folgt:

echo \'$nameoffile\'
'myFile'

Antwort2

Generell ist es keine gute Idee, eine Benutzerinteraktion zu erfordern. Ihr Skript lässt sich dadurch nicht automatisieren und wird für Ihre Benutzer sehr schwer zu verwenden, da sie die Eingaben in einer Umgebung manuell vornehmen müssen, in der die Tab-Vervollständigung nicht möglich ist.

Seit @maulinglawnsbereits erklärtwarum Ihr Skript fehlgeschlagen ist, zeige ich Ihnen eine einfachere Vorgehensweise, bei der Ihre Benutzer die Informationen nicht mühsam eintippen müssen:

#!/usr/bin/env sh

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

Um dann Dateien mit dem Namen zu finden foo.txt, die in den letzten 3 Tagen geändert wurden, und sie in bar.tar.gz zu archivieren, führen Sie Folgendes aus:

script.sh 3 foo.txt bar

Sie können auch eine einfache Fehlerprüfung hinzufügen, um sicherzustellen, dass das Skript immer mit der richtigen Anzahl Parameter ausgeführt wird:

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

Antwort3

read unterstützt beispielsweise die Benennung von Variablen;

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

verwandte Informationen