Chciałem usunąć część pakietu z mojego pliku domowego, ale nazwa pliku była zbyt długa ( google-chrome-stable_current_i386.deb
). Dlatego postanowiłem użyć polecenia ls|grep chrome|rm
do potokowania plików, aby grep odfiltrował plik chrome, a następnie go usunął. Nie działało, więc chciałbym zobaczyć, jak to zrobić.
33
rm -i *chrome*.deb
ls
find
-find . -name "*chrome*" -delete
.ls
przezgrep
sięrm
, ale nie mógł dostać się do pracy. W ten sposób otrzymasz jedną lub dwie dobre odpowiedzi na temat „poprawnego” lub „najłatwiejszego” sposobu wykonania zadania, zamiast zmuszać kogoś do udzielenia dobrej odpowiedzi na temat nieefektywnego rozwiązania.Odpowiedzi:
To prawie sprawiło, że się skrzywiłem.
ls
będzie bardziej skomplikowane i podatne na błędy niż ustalonych metod, jakfind [...] -exec
i globs .rm google
i naciśnij Tab. Jeśli nie zakończy się natychmiast, naciśnij Tabponownie, aby wyświetlić listę pasujących plików. Wpisz więcej znaków w nazwie pliku, aby zawęzić go do końca, a następnie uruchom polecenie.źródło
rm
- prawdopodobnie jest to jeden z bardziej powszechnych sposobów smażenia dystrybucji.Możesz także użyć polecenia find ze znakiem wieloznacznym:
Zauważ, że argument „-maxdepth” zapewnia, że find działa tylko w bieżącym katalogu i nie powraca do podkatalogów.
źródło
-iname
dla nazw plików bez rozróżniania wielkości liter (b) potok doxargs
używania-print0
flag dlafind
i-0
flag dlaxargs
. Użyciexargs
pozwala na wykonywanie czynności takich jak „interaktywne” (potwierdzanie usunięciafoo
?) Usuwanie .find . -name '*chrome*' -exec rm -i {} +
maxdepth
1.Miałeś dobry pomysł, po prostu przegapiłeś kilka szczegółów. Ponieważ masz do czynienia z listą zbliżającą się do STDIN i
rm
oczekuje parametrów, musisz użyćxargs
.A zatem:
Powinien dać ci to, czego chcesz.
Pamiętaj, że jeśli chcesz usunąć wszystko inne niż
chrome
plik, możesz po prostu dodać-v
dogrep
wyciągu.Pamiętaj, że według innych odpowiedzi na to pytanie jest to prawdopodobnie zły sposób na osiągnięcie tego, co chcesz osiągnąć.
źródło
-v
, czy to nie usunie wszystkiego oprócz pasujących plikówchrome
? Nie sądzę, że tego chce OP…ls
wyjściu nie ma „dziwnych” nazw plików . Nazwy plików ze spacjami to zniszczą. Jest to również niebezpieczne, jeśli ktoś może skonstruować nazwę pliku ze specjalnym sosem w katalogu, w którym to uruchomisz. Jak już zauważyła więcej niż jedna osoba, nie analizuj wyniku działania ls !Nigdy nie analizuj danych wyjściowych ls.
Sugeruję, aby unikać analizowania danych wyjściowych ls [ 1 ] , a nawet więcej, jeśli są one połączone z
del
poleceniem. Jest to z wielu powodów głównie związane z nieoczekiwanymi i nietypowymi znakami dozwolonymi w nazwie pliku.Nawet jeśli powinieneś spodziewać się, że nazwy plików należących do pakietów Linuksa będą „zachowywać się dobrze” , problem ten może się pojawić, jeśli w tym samym katalogu znajdują się inne pliki, ale nie wiedziałeś o tym ani nie zauważyłeś.
Lepiej używać
find
, rozwijania tabulatorów (zacznij pisać nazwę i naciśnij Tab), rozwijania nazw plików [ 2 ] jako*MyKey*
...Szybkie rozwiązanie
Ponieważ chcesz wybrać wszystkie pakiety (które kończą się
.deb
) za pomocą „google” w środku, możesz zbudować swoje zapytanie przy użyciu symbolu wieloznacznego*
*google*.deb
i zrobić prostektóra wybierze każdą nazwę pliku z „google” pośrodku, która zakończy się jako
.deb
obecna w bieżącym katalogu. Opcja-i
(interaktywna) poprosi o potwierdzenie, co jest dobrym nawykiem podczas usuwania plików z rozszerzaniem parametrów.Rozwiązanie zbliżone do filozofii twojej próby
Jeśli twoim celem jest budowanie linii poleceń kawałek po kawałku, więc zrobiłeś to
ls
pols | grep google
i tylko po sprawdzeniu wyjścia , możesz wykonać go w podpowłoce za$(...)
pomocąSzybszym i bardziej niebezpiecznym sposobem [ 3 ] jest użycie
!!
które wykona ostatnie polecenie zakończone w twojej historii . Można chronić się z faktu, że nie masz wizualną kontrolę linii, które masz zamiar wykonać, jeśli włączono wcześniej opcji powłoki
histverify
zshopt -s histverify
.źródło
...
-name '*c*.deb'
zamiast tego użyj lub innego wzoru, który Ci odpowiada.źródło
rm
nie akceptuje danych wejściowych odstdin
. Musisz zrobić coś takiegols google-chrome* | xargs rm
źródło