Jak usunąć pliki z wiersza poleceń za pomocą wyrażeń regularnych?

18

Powiedzmy, że mam 20 plików o nazwie FOOXX, gdzie XX to numer pliku, np. 01, 02 itd.

W tej chwili, jeśli chcę usunąć wszystkie pliki mniejsze niż 10, jest to łatwe i po prostu używam symboli wieloznacznych, np. Rm FOO0 *

Jeśli jednak chcę usunąć określone pliki z zakresu, np. 13-15, staje się to trudniejsze.

rm FPP [13-15] nie działa i pyta mnie, czy chcę usunąć wszystkie pliki. Podobnie rm FOO1 [3-5] chce usunąć wszystkie pliki, które zaczynają się od FOO1

Więc jaki jest najlepszy sposób na usunięcie takich zakresów plików?

Próbowałem zarówno z bash, jak i zsh, i nie sądzę, że różnią się tak bardzo dla tak podstawowego zadania?

Jacek
źródło
„... rm FOO1 [3-5] chce usunąć wszystkie pliki, które zaczynają się od FOO1” To nie ma sensu i na pewno tak nie jest.
Ignacio Vazquez-Abrams,
@Ignacio tak - chciałbym zobaczyć, że zestaw znaków ma tę kolejność sortowania!
kmarsh

Odpowiedzi:

31

W bash możesz użyć:

rm FOO1 {3..5}

lub

rm FOO1 {3,4,5}

usunąć FOO13, FOO14 i FOO15.

Nawiasy klamrowe Bash są tutaj udokumentowane .

Mike Fitzpatrick
źródło
2
Lub nawet rm FOO{13..15}.
Ignacio Vazquez-Abrams
Czy dotyczy to również ZSH?
Jack
@Jack: Tak jest.
Wstrzymano do odwołania.
@Jack: bashpolecenia tworzą podzbiór zpoleceń powłoki.
abhinavkulkarni
Muszę więc nauczyć się zarówno wyrażeń regularnych, jak i globbing. Boo Hoo. :)
Aditya MP
13

W przypadku przyszłych czytelników findpolecenie może również usuwać pliki. Postanowiłem rozwiązać ten problem:

find . -type f -regex '...' -delete

ale wybrana odpowiedź jest najprostszą odpowiedzią na to pytanie.

GregWW
źródło
Wybrana odpowiedź jest jednak dobra tylko dla plików zgodnych z konwencją nazewnictwa. Dzięki twojej odpowiedzi mogłem po prostu usunąć wszystkie pliki obiektowe z katalogu. (w moim przypadku po prostu poszedłem find . -name "*.o" -deletei działało to jak urok)
John Hamilton
6

ls | grep regex | xargs rm

gogiel
źródło
6
Powinieneś użyć find -regex ... -print0 | xargs -0 ...do tego, inaczej nie powiedzie się w przypadku nazw plików ze spacjami.
Wstrzymano do odwołania.
1
Oczywiście, jeśli zamierzasz używać find, równie dobrze możesz po prostu użyć -exec.
Ignacio Vazquez-Abrams,
W moim przypadku pliki miały spacje, a zmiana separatora rozwiązuje problem spacji: ls | grep regex | xargs --delimiter = '\ n' rm
Anake
1
-1 za próbę parsowania ls
evilsoup
@evilsoup, +1 za dodanie tego ostrzeżenia, ale kto wstawia nowy wiersz w nazwie pliku?
Iulian Onofrei