Usuń pliki z wyrażeniem regularnym

40

Próbowałem usunąć pliki, które zaczynają się na A, a kończą na 2 liczbach, ale nic nie robi.
Co próbowałem:

rm ^A*[0..9]2$

Gdzie się mylę?

gdoron wspiera Monikę
źródło

Odpowiedzi:

56

Możesz użyć następującego polecenia, aby usunąć wszystkie pliki spełniające Twoje kryteria:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm

Jak to działa:

  1. ls wyświetla wszystkie pliki (jeden po wierszu, ponieważ wynik jest przesyłany potokowo).

  2. grep -P "^A.*[0-9]{2}$" filtruje listę plików i pozostawia tylko te, które pasują do wyrażenia regularnego ^A.*[0-9]{2}$

    • .*wskazuje dowolną liczbę wystąpień ., gdzie .symbol wieloznaczny pasuje do dowolnego znaku.

    • [0-9]{2}wskazuje dokładnie dwa wystąpienia [0-9]dowolnej cyfry.

  3. xargs -d"\n" rmwykonuje się rm lineraz dla każdego line, co jest do niego przesyłane.

Gdzie się mylę?

Na początek rmnie przyjmuje wyrażenia regularnego jako argumentu. Oprócz symbolu wieloznacznego *każda inna postać jest traktowana dosłownie.

Ponadto wyrażenie regularne jest nieco wyłączone. Na przykład, *oznacza wszelkie wystąpienia ...w wyrażeniu regularnym, więc A*mecze A, AAitp, a nawet pusty ciąg.

Aby uzyskać więcej informacji, odwiedź Regular-Expressions.info .

Dennis
źródło
3
Uważaj na spacje w nazwach plików.
slhck
1
-d"\nPrzełącznik rozwiązuje problem przestrzeni.
Frg
1
Uwaga - niektóre dystrybucje (jak Mac OS) nie mają grep -P(wyrażenia regularne Perla). grep -Emoże działać w tym przypadku.
bluescrubbie
1
Wolę korzystania -Iz xargsi zawsze testy z nieśmiercionośnej poleceń pierwszy:xargs -d"\n" -I {} echo "{}"
jozxyqk
1
Parsowanie ls? Zobacz to pytanie, które wskazuje na ten artykuł . Z powodu pułapek rmmożesz zrobić to, czego nie chcesz.
Kamil Maciorowski
45

Lub używając find:

find your-directory/ -name 'A*[0-9][0-9]' -delete

To rozwiązanie poradzi sobie z dziwnymi nazwami plików.

Cyrus
źródło
4
To świetne rozwiązanie. Wolę to, ponieważ jest prostsze i możesz najpierw pominąć opcję -delete na końcu, aby sprawdzić, czy wyrażenie regularne jest poprawne przed masowym usunięciem plików.
JAMESSTONEco
1
Ponadto masz większą kontrolę nad tym, co usuwasz, na przykład dodając-type f
Marco Sulla,
Czy można tego użyć do usunięcia plików i folderów? Nie działa w przypadku niepustych folderów.
Alex
@Alex nope, katalog musi być pusty (zresztą i tak nie był to wymóg OP), możesz użyć tego xargspodejścia rm -f.
cyr
10

Zobacz sekcję rozwijania nazw plików na stronie podręcznika bash:

rm A*[0-9][0-9]
Glenn Jackman
źródło
działało dla mnie ładnie.
Nishanth Matha
To była najprostsza, ale pełna odpowiedź na pytanie.
Janac Meena
Czy to zadziała, jeśli folder zawiera wiele plików?
Itay
1

Rozwiązanie z wyrażeniem regularnym jest 200 razy lepsze, nawet dzięki temu możesz zobaczyć, który plik zostanie usunięty przed użyciem polecenia, odcinając końcowy potok:

ls | grep -P "^A.*[0-9]{2}$"

Następnie, jeśli jest to poprawne, po prostu użyj:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d "\n" rm

Jest to 200 razy lepiej, ponieważ jeśli pracujesz z Uniksem, ważne jest, aby wiedzieć, jak używać grep. Jest bardzo potężny, jeśli wiesz, jak go używać.

Salvatore
źródło
1
Wydaje się, że to niewiele więcej, niż mówi już 4-letnia odpowiedź Dennisa .
8bittree,
1
„200 razy” jest dość specyficzne. Wiele innych poleceń jest również bardzo potężnych, wystarczy nauczyć się ich używać.
glenn jackman
1

Działa to na moim komputerze Mac:

rm $(ls | grep -e '^A*[0..9]2$')

Promień
źródło
0

find polecenie działa również z wyrażeniami regularnymi.

Sprawdź, które pliki zostaną usunięte

find . -regex '^A.*[0-9]{2}$'

Usuń pliki

find . -regex '^A.*[0-9]{2}$' -delete
Petr Javorik
źródło