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ę?

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 .


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.


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


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ć.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.