it-swarm.com.de

So prüfen Sie, ob eine Datei in einem Shell-Skript vorhanden ist

Ich möchte ein Shell-Skript schreiben, das prüft, ob eine bestimmte Datei, archived_sensor_data.json, existiert, und wenn ja, löscht. Im Anschluss an http://www.cyberciti.biz/tips/find-out-if-file-exists-with-conditional-expressions.html habe ich Folgendes versucht:

[-e archived_sensor_data.json] && rm archived_sensor_data.json

Dies löst jedoch einen Fehler aus

[-e: command not found

wenn ich versuche, das resultierende Skript test_controller mit dem Befehl ./test_controller auszuführen. Was ist los mit dem Code?

135
Kurt Peek

Es fehlt ein erforderlicher Abstand zwischen der Klammer und -e:

#!/bin/bash
if [ -e x.txt ]
then
    echo "ok"
else
    echo "nok"
fi
292
chris01

Hier ist eine alternative Methode mit ls:

(ls x.txt && echo yes) || echo no

Wenn Sie eine Ausgabe von ls ausblenden möchten, sodass nur yes oder no angezeigt wird, leiten Sie stdout und stderr zu /dev/null um:

(ls x.txt >> /dev/null 2>&1 && echo yes) || echo no
19

Intern muss der Befehl rm ohnehin prüfen, ob eine Datei vorhanden ist.
warum also einen weiteren Test hinzufügen? Einfach ausstellen

rm filename

und es wird danach weg sein, ob es dort war oder nicht.
Mit rm -f möchten Sie keine Nachrichten über nicht vorhandene Dateien erhalten.

Wenn Sie Maßnahmen ergreifen müssen, wenn die Datei NICHT vorhanden ist, müssen Sie dies selbst testen. Aufgrund Ihres Beispielcodes ist dies in diesem Fall nicht der Fall.

5
T G

Der Hintergrund meiner Lösungsempfehlung ist die Geschichte eines Freundes, der in der zweiten Woche seines ersten Jobs einen halben Build-Server sauber gemacht hat. Die grundlegende Aufgabe besteht darin, herauszufinden, ob eine Datei vorhanden ist, und sie dann zu löschen. Aber es gibt ein paar verräterische Stromschnellen auf diesem Fluss:

  • Alles ist eine Datei.

  • Skripte sind nur dann wirklich leistungsfähig, wenn sie allgemeine Aufgaben lösen

  • Um allgemein zu sein, verwenden wir Variablen

  • In Skripten wird häufig -f force verwendet, um manuelle Eingriffe zu vermeiden

  • Und auch love -r recursive, um sicherzustellen, dass wir zeitnah erstellen, kopieren und zerstören.

Stellen Sie sich das folgende Szenario vor:

Wir haben die Datei, die wir löschen möchten: filesexists.json

Dieser Dateiname wird in einer Variablen gespeichert

<Host>:~/Documents/thisfolderexists filevariable="filesexists.json"

Wir haben auch eine Pfadvariable, um die Dinge wirklich flexibel zu machen

<Host>:~/Documents/thisfolderexists pathtofile=".."

<Host>:~/Documents/thisfolderexists ls $pathtofile

filesexists.json  history20170728  SE-Data-API.pem  thisfolderexists

Mal sehen, ob -e das tut, was es soll. Existieren die Dateien?

<Host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?

0

Es tut. Magie.

Was würde jedoch passieren, wenn die Dateivariable versehentlich zu nuffin ausgewertet würde?

<Host>:~/Documents/thisfolderexists filevariable=""

<Host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?

0

Was? Es soll mit einem Fehler zurückkommen ... Und dies ist der Anfang der Geschichte, wie dieser gesamte Ordner versehentlich gelöscht wurde

Eine Alternative könnte darin bestehen, gezielt zu testen, was wir als "Datei" verstehen.

<Host>:~/Documents/thisfolderexists filevariable="filesexists.json"

<Host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?

0

Die Datei existiert also ...

<Host>:~/Documents/thisfolderexists filevariable=""

<Host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?

1

Dies ist also keine Datei, und möglicherweise möchten wir nicht das gesamte Verzeichnis löschen

man test hat Folgendes zu sagen:

-b FILE

       FILE exists and is block special

-c FILE

       FILE exists and is character special

-d FILE

       FILE exists and is a directory

-e FILE

       FILE exists

-f FILE

       FILE exists and is a regular file

...

-h FILE

       FILE exists and is a symbolic link (same as -L)
4
Lefty G Balogh