Was mache ich falsch, wenn ich find -name mit tar in einem Bash-Skript verwende?

Was mache ich falsch, wenn ich find -name mit tar in einem Bash-Skript verwende?

Ich versuche zu lernen, wie man bashSkripte verwendet. Ich habe gegoogelt, kann aber keine Antwort auf mein Problem finden.

Das Skript sieht folgendermaßen aus:

#!/bin/bash
TIME=`date +%b-%d-%y`
FILENAME=backup-$TIME.tar.gz
DESDIR=home/pi/backups
SRC=home/pi/backuplist.txt
find -iname '*.orig' -o -iname '*.py' > home/pi/backuplist.txt
tar -zcvf $DESDIR/$FILENAME $SRC

wenn ich dies ausführe, wird es nicht erstellt, backuplist.txtsodass kein Ergebnis vorhanden ist, das verwendet werden kann tar.

ich habe versucht, es find -inamedirekt tarin einer Pipeline zu verwenden, habe aber nur die Antwort erhalten -iname command does not exist.

Wenn ich finddie Ausgabe zuerst im Terminal verwende und sie dann verwende, tarfunktioniert es.

Was mache ich falsch?

Bildbeschreibung hier eingeben

Antwort1

Dieses Skript weist zwei Hauptprobleme auf:

  1. Die Pfade sind relativ. Das bedeutet, dass beim Ausführen davon ausgegangen wird, dass home/piimAktuelles Verzeichnis. Ich habe das Gefühl, dass alle Vorkommen von home/piim Skript in geändert werden sollten /home/pi.

  2. Der tarBefehl ist wahrscheinlich dazu gedacht, die Dateien in der Datei zu sichern backuplist.txt. So wie er jetzt geschrieben ist, erhalten Sie ein tarArchiv, das die backuplist.txtDatei selbst und sonst nichts enthält. Wenn Sie dieInhaltdieser Datei verwenden tar -zcvf "$DESDIR/$FILENAME" -T "$SRC".

  3. Das Skript enthält auch Variablen ohne Anführungszeichen.

Ich denke, Sie möchten Folgendes:

#!/bin/bash

TIME="$(date +%b-%d-%y)"
FILENAME="backup-$TIME.tar.gz"
DESDIR="/home/pi/backups"
SRC="/home/pi/backuplist.txt"

find /home/pi -iname '*.orig' -o -iname '*.py' >"$SRC"
tar -zcvf "$DESDIR/$FILENAME" -T "$SRC"

Das /home/piin der findBefehlszeile ist eine wilde Vermutung. Ohne sie gehe ich davon aus, dass GNU finddas aktuelle Verzeichnis verwenden würde.

Antwort2

Ich denke, dass dieses leicht abgeänderte Skript Ihrem ursprünglichen Wunsch gerecht wird, die Liste der Dateien direkt in zu leiten tar.

Ich habe Variablen dort in Anführungszeichen gesetzt, wo sie verwendet werden, und Backticks `...`durch die moderne $(...)Konstruktion ersetzt.

Schließlich bin ich davon ausgegangen, dass Sie dies von aus ausführen möchten /, damit die von Ihnen verwendeten Pfade existieren können.

#!/bin/bash
WHEN=$(date +%b-%d-%y)
FILENAME="backup-$WHEN.tar.gz"
DESDIR=/home/pi/backups
SRC=/home/pi/backuplist.txt

mkdir -p "$DESDIR"

cd /
find -iname '*.orig' -o -iname '*.py' |
    tee "$SRC" |
    tar zcvf "$DESDIR/$FILENAME" --no-recursion --verbatim-files-from --files-from -

Sie können die beiden Referenzzeilen vollständig weglassen, $SRCwenn Sie die Dateiliste während des Sicherungsvorgangs nicht erstellen müssen.

verwandte Informationen