2010-03-23 2 views
10

Ich versuche, eine bestimmte Zeichenfolge aus einer Dateisuche auszuschließen.Eine Zeichenfolge aus der Platzhaltersuche in einer Shell ausschließen

Angenommen, ich habe eine Liste von Dateien: file_Michael.txt, file_Thomas.txt, file_Anne.txt.

Ich möchte in der Lage sein und so etwas wie

ls *<and not Thomas>.txt 

mir file_Michael.txt und file_Anne.txt schreiben zu geben, aber nicht file_Thomas.txt.

Die Rückseite ist einfach:

ls *Thomas.txt 

es mit einem einzelnen Zeichen zu tun, ist auch einfach:

ls *[^s].txt 

Aber wie es mit einer Schnur zu tun?

Sebastian

+1

möglich Duplikat [Wie kann ich inverse verwenden oder negative Platzhalter, wenn Mustervergleich in einer Unix/Linux-Shell?] (Http://stackoverflow.com/questions/216995/how-can-i-use- inverse-oder-negative-Wildcards-wenn-Muster-Abgleich-in-unix-linu) – Hasturkun

Antwort

12

mit bash

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

einige andere Möglichkeiten

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

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

Danke für die Antwort. Was bedeutet die erste Zeile? – steigers

+3

die erste Zeile bedeuten, erweiterte Globbing. Siehe http://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching für mehr – ghostdog74

16

finden Sie verwenden können, um dies zu tun:

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

Danke, das habe ich gebraucht. – steigers

+1

Sie müssen möglicherweise '-maxdepth 1' hinzufügen, um ein ähnliches Verhalten wie bei einem einfachen Platzhalter zu erhalten –

2

Wenn Sie einen Platzhalter sind Looping, überspringe den Rest einfach wenn Sie etwas ausschließen möchten.

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