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ę?
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:
ls
wyświetla wszystkie pliki (jeden po wierszu, ponieważ wynik jest przesyłany potokowo).
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.
xargs -d"\n" rm
wykonuje się rm line
raz dla każdego line
, co jest do niego przesyłane.
Gdzie się mylę?
Na początek rm
nie 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
, AA
itp, a nawet pusty ciąg.
Aby uzyskać więcej informacji, odwiedź Regular-Expressions.info .
-d"\n
Przełącznik rozwiązuje problem przestrzeni.grep -P
(wyrażenia regularne Perla).grep -E
może działać w tym przypadku.-I
zxargs
i zawsze testy z nieśmiercionośnej poleceń pierwszy:xargs -d"\n" -I {} echo "{}"
ls
? Zobacz to pytanie, które wskazuje na ten artykuł . Z powodu pułapekrm
możesz zrobić to, czego nie chcesz.Lub używając
find
:To rozwiązanie poradzi sobie z dziwnymi nazwami plików.
źródło
-type f
xargs
podejściarm -f
.Zobacz sekcję rozwijania nazw plików na stronie podręcznika bash:
źródło
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:
Następnie, jeśli jest to poprawne, po prostu użyj:
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ć.
źródło
Działa to na moim komputerze Mac:
rm $(ls | grep -e '^A*[0..9]2$')
źródło
find
polecenie działa również z wyrażeniami regularnymi.Sprawdź, które pliki zostaną usunięte
Usuń pliki
źródło