Antworten:
Überprüfen Sie nicht, ob die Datei vorhanden ist, sondern entfernen Sie sie.
rm -f /p/a/t/h
# or
rm /p/a/t/h 2> /dev/null
Beachten Sie, dass der zweite Befehl fehlschlägt (einen Exit-Status ungleich Null zurückgibt), wenn die Datei nicht vorhanden war, der erste jedoch aufgrund der Option -f
(kurz für --force
) erfolgreich ist. Dies kann je nach Situation ein wichtiges Detail sein.
Wenn Sie jedoch an die Datei anhängen, liegt dies eher daran, dass Ihr Skript verwendet >>
, um etwas in die Datei umzuleiten. Ersetzen Sie einfach >>
mit >
. Es ist schwer zu sagen, da Sie keinen Code angegeben haben.
Beachten Sie, dass Sie so etwas test -f /p/a/t/h && rm /p/a/t/h
tun können, dies jedoch völlig sinnlos ist. Es ist durchaus möglich, dass der Test true zurückgibt, aber das / p / a / t / h nicht vorhanden ist, bevor Sie versuchen, es zu entfernen, oder schlimmer noch, der Test schlägt fehl und das / p / a / t / h wird erstellt bevor Sie den nächsten Befehl ausführen, der erwartet, dass er nicht existiert. Dies zu versuchen ist eine klassische Rennbedingung. Tu es nicht.
rm /p/a/t/h 2> /dev/null
Der Rückkehrcode ( echo $?
) wird nicht als 0 beibehalten, wenn die Datei nicht vorhanden ist. Das würde dazu führen, dass Jenkins Jobs fehlschlagen, nur weil wir versucht haben, eine nicht vorhandene Datei zu löschen.
noclobber
in Bash) oder die vorhandene Datei so ändern, dass die Umleitung fehlschlägt, wenn die Datei vorhanden ist (die Race-Bedingung wird nicht vermieden). Aber alles, was Sie tun können, ist, die Fehler subtiler zu machen.
Ein anderer einzeiliger Befehl, den ich verwendet habe, ist:
[ -e file ] && rm file
Sie können dies verwenden:
#!/bin/bash
file="file_you_want_to_delete"
if [ -f $file ] ; then
rm $file
fi
echo $?
keine 1 angezeigt wird, wenn keine Datei vorhanden ist.
Wenn Sie den Schritt ignorieren möchten, um zu überprüfen, ob eine Datei vorhanden ist oder nicht, können Sie einen recht einfachen Befehl verwenden, der die Datei löscht, falls vorhanden, und keinen Fehler auslöst, wenn sie nicht vorhanden ist.
rm -f xyz.csv
-f
es keinen Fehler werfen würde. Diese Antwort hat mir geholfen, danke.
So etwas würde funktionieren
#!/bin/sh
if [ -fe FILE ]
then
rm FILE
fi
-f prüft, ob es sich um eine reguläre Datei handelt
-e prüft, ob die Datei existiert
Einführung in if für weitere Informationen
BEARBEITEN: -e, das mit -f verwendet wird, ist redundant, wenn -f allein verwendet werden sollte
-a
ist veraltet, verwenden Sie -e
stattdessen.
-f
.
-e
in -fe
ist überflüssig, da -f
auch überprüft die Existenz der Datei soweit ich weiß ..
if [ $( ls <file> ) ]; then rm <file>; fi
Wenn Sie Ihre Ausgabe >
stattdessen mit umleiten >>
, wird die vorherige Datei überschrieben
file
es so etwas ist5 -lt 2
rm $my_file
, oder? Welche Shell benutzt du?