Odpowiedzi:
Nie zawracaj sobie głowy sprawdzaniem, czy plik istnieje, po prostu spróbuj go usunąć.
rm -f /p/a/t/h
# or
rm /p/a/t/h 2> /dev/null
Zauważ, że drugie polecenie zakończy się niepowodzeniem (zwróci niezerowy status wyjścia), jeśli plik nie istniał, ale pierwsze odniesie sukces dzięki opcji -f
(skrót od --force
). W zależności od sytuacji może to być ważny szczegół.
Ale bardziej prawdopodobne jest, że jeśli dołączasz się do pliku, dzieje się tak dlatego, że Twój skrypt >>
przekierowuje coś do pliku. Wystarczy wymienić >>
z >
. Trudno powiedzieć, ponieważ nie podałeś kodu.
Pamiętaj, że możesz zrobić coś takiego test -f /p/a/t/h && rm /p/a/t/h
, ale jest to całkowicie bezcelowe. Jest całkiem możliwe, że test zwróci wartość true, ale / p / a / t / h nie będzie istniał przed próbą jego usunięcia, lub gorzej test zakończy się niepowodzeniem i / p / a / t / h zostanie utworzony przed wykonaniem następnego polecenia, które oczekuje, że nie będzie istnieć. Próba tego jest klasycznym warunkiem wyścigu. Nie rób tego
rm /p/a/t/h 2> /dev/null
nie zachowa kodu powrotu ( echo $?
) jako 0, jeśli plik nie istnieje. To sprawiłoby, że Jenkins byłby w pewnym sensie niepowodzeniem tylko dlatego, że próbowaliśmy usunąć nieistniejący plik.
noclobber
w bash), lub może przeskoczyć istniejący plik, aby przekierowanie nie powiodło się, jeśli plik istnieje (nie omija warunków wyścigu), ale wystarczy, że błędy będą bardziej subtelne.
Innym poleceniem w jednym wierszu jest:
[ -e file ] && rm file
Możesz użyć tego:
#!/bin/bash
file="file_you_want_to_delete"
if [ -f $file ] ; then
rm $file
fi
echo $?
nie daje 1, jeśli plik nie istnieje.
Jeśli chcesz zignorować krok, aby sprawdzić, czy plik istnieje, czy nie, możesz użyć dość łatwego polecenia, które usunie plik, jeśli istnieje, i nie wyśle błędu, jeśli nie istnieje.
rm -f xyz.csv
-f
temu nie rzuci błędu. Ta odpowiedź pomogła mi, dziękuję.
Coś takiego działałoby
#!/bin/sh
if [ -fe FILE ]
then
rm FILE
fi
-f sprawdza, czy jest to zwykły plik
-e sprawdza, czy plik istnieje
Wprowadzenie do if, aby uzyskać więcej informacji
EDYCJA: -e użyte z -f jest redundantne, dla samego użycia -f też powinno działać
-a
jest przestarzałe, użyj -e
zamiast niego.
-f
.
-e
w -fe
jest zbędna, jak -f
również sprawdza istnienie pliku jako o ile wiem ..
if [ $( ls <file> ) ]; then rm <file>; fi
Ponadto, jeśli przekierujesz dane wyjściowe, >
zamiast >>
tego zastąpi poprzedni plik
file
jest coś takiego5 -lt 2
rm $my_file
, prawda? Jakiej powłoki używasz?