Mam kilka plików o tej samej podstawowej nazwie pliku. Chciałbym usunąć wszystkie oprócz jednego
foo.org #keep
foo.tex #delete
foo.fls #delete
foo.bib #delete
etc
Gdybym nie musiał go mieć, wiem, że mógłbym go użyć rm foo.*
.
TLDP demonstruje ^
zanegowanie dopasowania. Dzięki próbom i błędom udało mi się to znaleźć
rm foo.*[^org]
robi to, czego potrzebuję, ale tak naprawdę nie rozumiem składni.
Ponadto, chociaż nie jest to ograniczenie w moim przypadku użycia, myślę, że ten wzór również ignoruje foo.o
i foo.or
. Jak działa ten wzorzec i jak wyglądałby glob ignorujący tylko foo.org
?
rm foo.*[^org]
usuwa wszystkie pliki, których ostatnia postać jest anio
,r
albog
, więcfoo.foo
nie pasuje albo.Regular Expression
. Powinieneś uważać na swoje postacie grupujące. Za pomocą wsporników już podano klasy znaków sens, że chcesz usunąć wszystkie pliki, które miały rozszerzenie z literamio
,r
albog
w dowolnej kolejności. Użyj nawiasu, aby utworzyć grupę i zachować kolejność znaków.foo.*[^org]
będzie pasował do każdej nazwy pliku, która zaczyna sięfoo.
od jednego lub więcej znaków po kropce, gdzie ostatnim znakiem nie jest o, r lub g. Tak by pasowałofoo.orb
, ale niefoo.org
lubfoo.or
lubfoo.o
. Odpowiedź GlennJackman pokazuje, jak włączyć funkcje rozszerzonego dopasowywania wzorca, aby negować dopasowanie.Odpowiedzi:
To jest „foo”. po którym następuje coś NIE „org”
ref: https://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching
źródło
@()
dla listy wzorców: stackoverflow.com/a/217208/3779853W bash możesz także użyć
GLOBIGNORE="*.org"; rm -i foo*
.A
unset GLOBIGNORE
kiedy skończone.To nie jest tak naprawdę lepsze niż
shopt -s extglob
, ale łatwiej mi zapamiętać.źródło
( GLOBIGNORE="*.org"; rm -i foo* )
GLOBIGNORE="*foo*:*bar*"
Rura może zrobić?
(oczywiście możesz chcieć zastąpić echo rm w ostatnim łańcuchu).
źródło
ls -1
powinien być bardziej niezawodny, aby mieć pewność, że wszystkie pliki są obsługiwanegrep
osobnoOP był bardzo blisko:
choć w tym przypadku nie
*
jest to konieczne.źródło