2010-03-23 6 views
10

Próbuję wykluczyć pewien ciąg znaków z wyszukiwania plików.Wyklucz ciąg znaków z wyszukiwania wieloznacznego w powłoce

Załóżmy, że mam listę plików: file_Michael.txt, file_Thomas.txt, file_Anne.txt.

Chcę być zdolne i napisać coś

ls *<and not Thomas>.txt 

dać mi file_Michael.txt i file_Anne.txt, ale nie file_Thomas.txt.

Odwrotna jest proste:

ls *Thomas.txt 

Robi to za pomocą jednego znaku jest również proste:

ls *[^s].txt 

Ale jak to zrobić z ciągiem?

Sebastian

+1

możliwe duplikat [Jak mogę używać odwrotność lub negatywne symbole wieloznaczne, gdy dopasowanie wzorca w powłoce UNIX/Linux?] (Http://stackoverflow.com/questions/216995/how-can-i-use- odwrotne lub negatywne znaki-przy dopasowywaniu wzorca-w-a-unix-linu) – Hasturkun

Odpowiedz

12

z bash

shopt -s extglob 
ls !(*Thomas).txt 

kilka innych sposobów

find . -type f \(-iname "*.txt" -a -not -iname "*thomas*" \) 

ls *txt |grep -vi "thomas" 
+1

Dzięki za odpowiedź. Co oznacza pierwsza linia? – steigers

+3

pierwsza linia oznacza zestaw rozszerzonego globowania. zobacz http://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching dla więcej – ghostdog74

16

można użyć Znajdź, aby to zrobić:

$ find . -name '*.txt' -a ! -name '*Thomas.txt' 
+0

Dzięki, to jest to, czego potrzebowałem. – steigers

+1

Może być konieczne dodanie '-maxdepth 1', aby uzyskać podobne zachowanie do prostego symbolu wieloznacznego –

2

Jeśli zapętlenia wieloznaczny, po prostu pomiń resztę jeśli istnieje coś, co chcesz wykluczyć.

for file in *.txt; do 
    case $file in *Thomas*) continue;; esac 
    : ... do stuff with "$file" 
done