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ę?
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:
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
z xargs
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łapek rm
możesz zrobić to, czego nie chcesz.
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.
-type f
xargs
podejścia rm -f
.
Zobacz sekcję rozwijania nazw plików na stronie podręcznika bash:
rm A*[0-9][0-9]
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ć.
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