Jak usunąć wszystkie pliki zwrócone przez lokalizację

13

W tej chwili robię to:

Krok 1:

locate fooBar
/home/abc/fooBar
/home/abc/Music/fooBar

Krok 2:

Ręcznie usuń, kopiując i wklejając każdą linię.

rm /home/abc/fooBar
rm /home/abc/Music/fooBar

Jak to zrobić w jednym kroku? Coś jak

zlokalizuj fooBar> rm

Dzięki.

theTuxRacer
źródło
Chcesz tego? rm -i zlokalizuj fooBar``
LFC_fan
Nie jestem pewien, co robi powyższe. Chcę tylko usunąć wszystkie pliki ze ścieżek, które są zwracane po uruchomieniu polecenia lokalizowania.
theTuxRacer,

Odpowiedzi:

13

Jak już wspomnieli inni faceci, xargs jest twoim przyjacielem. To naprawdę potężne narzędzie, a ja postaram się to wyjaśnić i przedstawić obejście dla zwykłej gotcha.

Xargs pobiera wiersz z wejścia i dołącza go do innego polecenia, wykonując to polecenie dla każdego wiersza na wejściu. Tak przez pisanie locate foobar | xargs rm -f, wyjście polecenia zlokalizowania zostaną poprawione na końcu tego rm -fpolecenia i wykonywane dla każdej linii produkowanych przez locate foobar.

Gotcha:

Ale co, jeśli w linii (liniach) są spacje zwrócone przez locate? To złamie rm -fpolecenie, ponieważ argumenty przekazywane do rm muszą być plikami (chyba że użyjesz przełącznika -r), a ścieżka do pliku musi być zmieniona lub cytowana, jeśli zawiera spacje.

xargs udostępnia przełącznik -i, który zastępuje dane wejściowe w następującym po nim poleceniu, a nie tylko dołącza je. Więc zmienię sugestię na

locate foobar | xargs -ixxx rm -f 'xxx'

który teraz się zepsuje tylko wtedy, gdy nazwy plików zwrócone przez locate zawierają apostrofy.

Muszę zgodzić się z qbi, że powinieneś być ostrożny przy używaniu rm -f ! Użyj flagi -p, aby xargs, lub po prostu uruchom sam lokalizuj foobar przed podaniem go do xargs, lub upuść -f z rm.

locate foobar | xargs -p -ixxx rm -f 'xxx'
finley
źródło
9
Aby być odpornym na pliki z egzotycznymi znakami (znaki nowej linii, cytaty, apostrofy itp.) W ich nazwach, możesz użyć opcji -0( --null) do zlokalizowania i xargs. Wykorzystuje bezpieczny znak ASCII NUL do oddzielania nazw plików:locate -0 foobar | xargs -0 rm
Jukka Matilainen,
1
+1 za odpowiedź i wybrana do wzmianki o gotcha ^ _ ^
theRuxRacer
Próbowałem, ale to nie działało.
Pronoy999
Częściowo pracował
SteveS,
7

Być może potrzebujesz więcej opcji do użycia z xargs. Najpierw przetestuj za pomocą xargs -p. Jeśli jest OK, usuń -popcję:

locate foobar | xargs rm
qbi
źródło
6

Aby usunąć wszystkie pliki zwrócone przez lokalizację, wydaj następujące polecenie w swoim terminalu

locate foobar | xargs rm -f

karthick87
źródło