Jste si jisti, že se děje to, co chcete? Když spustíte ls /directory | grep '[^term]'
v podstatě nepátráte po písmenech t e r m. To znamená, že pokud má soubor ve svém názvu jiná písmena, bude se stále zobrazovat ve výstupu ls
. Vezměte si například následující adresář:
$ ls
alpha brave bravo charlie delta
Nyní, když spustím ls |grep '^[brav]'
Dostávám následující:
$ ls |grep '^[brav]'
alpha
brave
bravo
Jak můžete vidět, nejenže jsem dostal brave
a bravo
Také mám alpha
protože znaková třída []
obdrží jakýkoli dopis z tohoto seznamu.
Pokud tedy spustím ls |grep '[^brav]'
Všechny soubory, které neobsahují znaky b r a v, dostanu kamkoli v názvu.
$ ls |grep '[^brav]'
alpha
bravo
brave
charlie
delta
Pokud si všimnete, že obsahuje celý výpis adresáře, protože všechny soubory měly alespoň jeden písmeno, které nebylo zahrnuto do třídy znaků.
Takže jak řekl Kanvuanza, sáhnout po inverzní hodnotě "termín" na rozdíl od znaků t e r m
měli byste to udělat pomocí grep -v
.
Například:
$ ls |grep -v 'brav'
alpha
charlie
delta
Také pokud nechcete, aby soubory, které mají ve třídě nějaké znaky, použijte grep -v '[term]'
. To zabrání zobrazení souborů, které mají některý z těchto znaků. (Kanvuanzova odpověď)
Například:
$ ls |grep -v '[brav]'
Jak můžete vidět, nebyly uvedeny žádné soubory, protože všechny soubory v tomto adresáři obsahovaly alespoň jedno písmeno z této třídy.
Dodatek:
Chtěl jsem dodat, že pomocí PCRE je možné použít pouze regex k odfiltrování pomocí negovaných výrazů. K tomu byste použili něco známého jako negativní dopředný regulární výraz:(?!<regex>)
.
Takže pomocí výše uvedeného příkladu můžete udělat něco takového, abyste získali požadované výsledky bez použití grep
příznaky.
$ ls | grep -P '^(?!brav)'
alpha
charlie
delta
Aby bylo možné tento regulární výraz dekonstruovat, nejprve se shoduje na začátku řádku ^
a poté hledá řetězce, které neodpovídají brav
následovat poté. Pouze alpha
, charlie
a delta
shodují se, takže jsou to jediné, které se vytisknou.
Myslím, že grep -v
vlajka dělá, co chcete. Z manuálové stránky:
-v, --invert-match
Invert the sense of matching, to select non-matching lines.
Můžete použít ls /directory | grep -v [term]
vytisknout všechny neodpovídající řádky.