Idealnie chciałbym takie polecenie
rm --only-if-symlink link-to-file
ponieważ spaliłem się zbyt wiele razy przypadkowo usuwając plik zamiast dowiązania symbolicznego wskazującego na plik. Może to być szczególnie złe, gdy zaangażowane jest sudo. Teraz oczywiście robię to, ls -al
aby upewnić się, że naprawdę jest to dowiązanie symboliczne i takie, ale jest podatne na błąd operatora (podobnie nazwany plik, literówka itp.) I warunki wyścigu (jeśli ktoś z jakiegoś powodu chciał mnie usunąć). Czy jest jakiś sposób, aby sprawdzić, czy plik jest dowiązaniem symbolicznym i usunąć go tylko, jeśli jest w jednym poleceniu?
bash
command-line
rm
Shelvacu
źródło
źródło
Odpowiedzi:
źródło
!
i zmienić||
na&&
||
formę.&&
obniża poziom, jeśli jesteś wset -e
trybie.[ ! -L $1 ]
), przy użyciu niepoprawnego operatora ([ ! -l foo ]
), a nawet błąd składniowy ([ ! -q foo || echo foo
)rm_if_link(){ [ -L "$1" ] && rm -v "$1"; }
polega na tym, że uruchomienie go wset -e
trybie bez dowiązania zabije proces powłoki. Możesz dołączyć,|| :
ale wtedy staje się, IMHO, jeszcze mniej wyraźne niż! ||
wersja, i zapobiegnie torm
zabiciu cię przez niepowodzenieset -e
, co jest prawdopodobnie niepożądane.! ||
jest dość zwięzły i jasny i nie cierpi na żaden z tych problemów.rm
test w swoim wnętrzu, b) użyj rzeczywistej instrukcji if, c) nie chodź za pomocą-e
wewnętrznych interaktywnych powłok (i przetestuj swoje skrypty!). Jeśli chcesz spierać się o czytelność, skorzystanieif
z testu, czy coś jest linkiem, jest wyraźnie zwycięzcą.Można użyć
find
, a jego-type l
stan testu (który sprawdza, jeśli okazało się, że obiekt jest l atrament lub nie)Na przykład, jeśli masz plik o nazwie
foo
w bieżącym katalogu, możesz to zrobić:Możesz to uprościć za pomocą:
Co spowoduje usunięcie wszystkich dowiązań symbolicznych w bieżącym katalogu.
Ostrzeżenie:
-delete
Opcja wfind
to naprawdę bardzo niebezpieczne. UPEWNIJ SIĘ, ŻE UMIESZCZASZ NA KOŃCU ZNAJDUJĄCEGO POLECENIA Jeśli go zgubisz, usunie wszystko, co znajdzie, niezależnie od tego, czy wyniki są zgodne z twoim warunkiem.Jak sugerowano w komentarzach, bezpieczniejszą opcją może być użycie
find
irm -i
(co zmusza do potwierdzenia usunięcia pliku) w połączeniu:Osobiście używam
-exec trash {} \;
do tymczasowego usuwania plików, ponieważ ja, podobnie jak ty, zostałem spalonyrm
w przeszłości. Podwójnie oznacza źle umieszczoną-delete
flagę.http://slackermedia.ml/trashy
źródło
find . -type l -iname "foo" | xargs rm -i
jest bezpieczniej.rm -i
dla bezpieczeństwa.-print0
forfind
i-0
forxargs
.@
jest kwalifikatorem globalnym ; wzórfoo(@)
pasuje do tegofoo
, co pasuje, ale tylko do dowiązań symbolicznych.foo(-@)
pasowałyby tylko zepsute dowiązania symbolicznefoo(@,L0)
pasowałyby tylko dowiązania symboliczne i puste pliki.Oczywiście, jeśli korzystasz z ZHS, po prostu musisz wpisać
rm foo(@)
. Trzeba uważać, aby nie naciskać Enterprzed pisaniem(@)
.źródło