Odpowiedzi:
Używanie rozszerzonego wzorca globowania w bash
:
rm ./!(*999*)
Wymaga shopt -s extglob
to włączenia (i bezpieczeństwa również shopt -s failglob
, aby żaden plik o nietypowej nazwie !(*999*)
nie został przypadkowo usunięty, jeśli wszystkie nazwy plików zawierają 999
). Wzorzec !(*999*)
będzie pasował do dowolnej nazwy w bieżącym katalogu, z wyjątkiem pasujących nazw *999*
. Aby również usunąć ukryte pliki (pliki, których nazwa zaczyna się od kropki ), również włącz tę dotglob
opcję.
Aby dbać tylko o zwykłe pliki lub dowiązania symboliczne do zwykłych plików (nie katalogów itp.):
for name in ./!(*999*); do [ -f "$name" ] && rm "$name"; done
zsh
Powłoki równoważne wyżej pętli byłoby
rm ./(^(*999*))(.)
Twoje pierwsze polecenie nie będzie działać, ponieważ grep
zajrzy do plików. Usunąłby wszystkie pliki, które nie mają 999
w nich linii (gdybyś dodał --null
opcję, aby działała xargs -0
).
Drugie polecenie nie będzie działać, ponieważ grep
w systemie macOS nie jest obsługiwane --null-data
(ma jednak --null
opcję, ale tylko w przypadku generowania pliku wyjściowego). Zauważ też, że szukałby 999
dowolnego miejsca na ścieżce pliku (w tym komponentów katalogu), nie tylko nazwy pliku.
failglob
opcję, ponieważ może to spowodować usunięcie pliku o nazwie, !(*999*)
jeśli nie ma innego pliku, którego nazwa nie zawiera 999
.
Po prostu odwróć warunek nazwy w find
:
find . -type f \! -name "*999*"
Dodaj -delete
lub -exec rm {} +
faktycznie usuń dopasowane pliki.
!
jest bezpieczny w bash
.
grep -l
powoduje, że wyświetla listę plików, w których znaleziono dopasowanie (lub nie znaleziono go-v
) w treści , a nie w nazwie pliku.grep
zawsze pasuje do zawartości określonych plików, nigdy ich nazw.