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.
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.
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.Odpowiedzi:
Używanie rozszerzonego wzorca globowania w
bash
: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.):
zsh
Powłoki równoważne wyżej pętli byłobyTwoje 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łaxargs -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łby999
dowolnego miejsca na ścieżce pliku (w tym komponentów katalogu), nie tylko nazwy pliku.źródło
failglob
opcję, ponieważ może to spowodować usunięcie pliku o nazwie,!(*999*)
jeśli nie ma innego pliku, którego nazwa nie zawiera999
.Po prostu odwróć warunek nazwy w
find
:Dodaj
-delete
lub-exec rm {} +
faktycznie usuń dopasowane pliki.źródło
!
jest bezpieczny wbash
.