Odpowiedzi:
Używanie rozszerzonego wzorca globowania w bash:
rm ./!(*999*)
Wymaga shopt -s extglobto 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ę dotglobopcję.
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
zshPowłoki równoważne wyżej pętli byłoby
rm ./(^(*999*))(.)
Twoje pierwsze polecenie nie będzie działać, ponieważ grepzajrzy do plików. Usunąłby wszystkie pliki, które nie mają 999w nich linii (gdybyś dodał --nullopcję, aby działała xargs -0).
Drugie polecenie nie będzie działać, ponieważ grepw systemie macOS nie jest obsługiwane --null-data(ma jednak --nullopcję, ale tylko w przypadku generowania pliku wyjściowego). Zauważ też, że szukałby 999dowolnego miejsca na ścieżce pliku (w tym komponentów katalogu), nie tylko nazwy pliku.
failglobopcję, 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 -deletelub -exec rm {} +faktycznie usuń dopasowane pliki.
!jest bezpieczny w bash.
grep -lpowoduje, że wyświetla listę plików, w których znaleziono dopasowanie (lub nie znaleziono go-v) w treści , a nie w nazwie pliku.grepzawsze pasuje do zawartości określonych plików, nigdy ich nazw.