Usuń pliki bez ciągu w nazwie

9

Chcę usunąć pliki, które nie mają w nazwie nazwy „999” (bez „”).

Próbowałem:

grep -vlr 999 . | xargs -0 rm -f --
find . -print0 | grep --null-data -v 999 | xargs -0 rm --

Ale żaden z nich nie działa. Używam macOS Sierra z bash: 3.2.57.

plr
źródło
2
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.
JoL

Odpowiedzi:

18

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.

Kusalananda
źródło
1
Chciałbyś również włączyć tę failglobopcję, ponieważ może to spowodować usunięcie pliku o nazwie, !(*999*)jeśli nie ma innego pliku, którego nazwa nie zawiera 999.
Stéphane Chazelas,
16

Po prostu odwróć warunek nazwy w find:

find . -type f \! -name "*999*" 

Dodaj -deletelub -exec rm {} +faktycznie usuń dopasowane pliki.

ilkkachu
źródło
2
!jest bezpieczny w bash.
Kusalananda