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/nullnie 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.
noclobberw 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
-ftemu 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ć
-ajest przestarzałe, użyj -ezamiast niego.
-f.
-ew -fejest zbędna, jak -fró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
filejest coś takiego5 -lt 2
rm $my_file, prawda? Jakiej powłoki używasz?