alternatywne opcje dla rm -f

10

Chciałbym uruchomić wiersz poleceń:

cd ~/www/tmp/; rm -P 2*

Ale pojawia się błąd, jeśli nie ma plików zaczynających się od 2.

Można by pomyśleć, że chciałbym jednak użyć -f:

-f      Attempt to remove the files without prompting for confirmation, regardless of the file's permissions.  If the file does not exist, do not display a diagnostic message or modify the exit status to reflect an error.

I zrobić dbają o pliku permissions- czy jest coś dziwnego dzieje wolałbym polecenie Przerwij. Chcę tylko ukryć błędy „nie istnieją”.

Przejrzałem inne pytania z „błędami rm” i znalazłem te dwa, które wydają się (trochę) istotne:

Usuń pliki i katalogi według ich nazw. Brak takiego pliku lub katalogu

Ale nie rozumiem wszystkiego, co dzieje się w odpowiedziach na to pytanie, i nie wiem, że go potrzebuję?

touchHack zaproponował w tej kwestii:

Czy rm nie zgłosił braku pliku?

Wydaje się to wykonalne, ponieważ nie sądzę, żebym miał na myśli poprawę wydajności (ale jaki typ wydajności miałbyś podjąć?

Nie jestem pewien, jak zrobiłbym to if-thenw linii poleceń.

Czy są jakieś inne opcje prostego czyszczenia wiersza polecenia z wklejaniem i wklejaniem?

Czy find -deletelepiej by działało w moim przypadku? Jeśli tak, to dlaczego?


omawiany błąd:

rm: 2*: No such file or directory
użytkownik3082
źródło
1
Błąd pochodzi od twojej powłoki, rmwięc musisz powiedzieć, co to jest.
Michael Homer
Czy używasz zshjako interaktywnej powłoki? Czy pojawia się No matches foundbłąd?
Kusalananda
2
@MichaelHomer Nie, błąd pochodzi z rm. Powłoka po prostu przekazała ciąg 2*do rm zamiast rozszerzać go do listy plików. Spójrz na ten błąd: mówi, że rm narzeka, a nie sh / bas / zsh / ...
doneal24

Odpowiedzi:

13

Aby wywołać tylko rm -Pdla istniejących zwykłe pliki, których nazwy pasują do wzorca w katalogu (ale nie poniżej):

find directory -maxdepth 1 -type f -name 'pattern' -exec rm -P {} +

Na przykład,

find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +

Aby dopasować tylko nie-katalogi, użyj ! -type dzamiast -type f. Różnica polega na tym, ! -type dże dotyczy to szerszego zakresu typów plików (dowiązania symboliczne, nazwane potoki, gniazda itp.)

Ponieważ chcesz zostać poproszony o wykryto pewne warunki na plikach, należy nie używać -deletezamiast -exec rmod który działa jak rm -f.

Usuń, -maxdepth 1aby findrekurencyjnie przeglądać podkatalogi.

Kusalananda
źródło
3
Myślę, że chociaż ! -type dmoże być bliżej rm 2*?
muru
Więc musiałbym dodać -P, aby uzyskać tę funkcjonalność ?:find ~/www/tmp/ -maxdepth 1 -type f -name '2*' -exec rm -P {} +
user3082
@ user3082 Tak, zapomniałem, że też chciałeś użyć -P.
Kusalananda
Dzięki @muru, tak naprawdę chcę -type f, ale nie wiedziałem, jak się tak rmzachowywać - więc sugestia @ Kusalanada była trafiona, a różnicowanie / objaśnienie jest świetne do nauki.
user3082
@ user3082 prawdopodobnie będziesz musiał użyć rozszerzonego globowania powłoki (np. rm 2*(.)w zsh).
muru