2012-11-11 13 views
12

Attualmente sto provando a fare uno script che verrebbe immesso in input per vedere se qualcosa è di un certo tipo di file (zip per esempio), sebbene il testo prima del tipo di file possa essere qualsiasi cosa, per esempioCome grep per un'estensione di file

something.zip 
this.zip 
that.zip 

rientrano tutti nella categoria. Sto cercando di grep per queste utilizzando un jolly, e finora ho provato questo

grep ".*.zip" 

Ma ogni volta che lo faccio, sarà trovare i file .zip bene, ma sarà ancora dell'uscita del display se ci sono supplementari i caratteri dopo .zip quindi, ad esempio .zippppppp o .zipdsjdskjc, verrebbero comunque rilevati da grep. Detto questo, cosa dovrei fare per impedire a grep di visualizzare corrispondenze con caratteri aggiuntivi dopo lo .zip?

risposta

32

Test per la fine della linea con $ e sfuggire al secondo . con una barra rovesciata in modo che corrisponda solo a un punto e non a nessun carattere.

grep ".*\.zip$" 

Tuttavia ls *.zip è un modo più naturale di fare questo se si desidera elencare tutti i file .zip nella directory corrente o find . -name "*.zip" per tutti .zip file nelle sottodirectory a partire da (e compresa) il directory corrente.

+2

ha funzionato perfettamente, grazie! – lacrosse1991

+0

Come dire 'grep" \ .zip "' – Steve

0

semplicemente:

grep ".*.zip$" 

Il "$" indica la fine della linea di

+1

Nota, questo includerebbe file come 'hello.unzip' o' hi.xzip', o anche 'hellozip'. Dovresti sfuggire al secondo "." – twasbrillig

4

Hai bisogno di fare un paio di cose. Dovrebbe apparire così:

grep '.*\.zip$' 

È necessario sfuggire al secondo punto, quindi corrisponderà semplicemente a un punto e non a nessun carattere. L'uso di virgolette singole rende l'escape un po 'più facile.

È necessario il simbolo del dollaro alla fine della riga per indicare che si desidera che lo "zip" si verifichi alla fine della riga.

12

Su UNIX, provare:

find . -name \*.zip -print 
+0

Super veloce - grazie – Mick

2

Prova: grep -o -E "(\\.([A-z])+)+"

Ho usato questo per ottenere multi-punteggiato/più estensioni. Quindi se l'input era hello.tar.gz, restituirebbe .tar.gz. Per singolo punto, utilizzare grep -o -E "\\.([A-z])+$". Testato su Cygwin/MingW + MSYS.

1

Ancora una correzione/addon dell'esempio di cui sopra:

# multi-dotted/multiple extensions 
grep -oEi "(\\.([A-z0-9])+)+" file.txt 

# single dotted 
grep -oEi "\\.([A-z0-9])+$" file.txt 

In questo modo ottenere le estensioni di file come' .mp3' ed ecc

0

Basta rivedere alcune delle altre risposte. Il .* non è necessario, e se stai cercando una certa estensione di file, è meglio includere -i in modo che non distingue maiuscole e minuscole; nel caso in cui il file sia HELLO.ZIP, per esempio. Non penso che anche le virgolette siano necessarie.

grep -i \.zip$ 
1

Io lo uso per ottenere un elenco dei tipi di file all'interno di una cartella.

find . -type f | egrep -i -E -o "\.{1}\w*$" | sort -su 

Uscite per esempio:

.DS_Store 
.MP3 
.aif 
.aiff 
.asd 
.doc 
.flac 
.jpg 
.m4a 
.m4p 
.m4r 
.mp3 
.pdf 
.png 
.txt 
.wav 
.wma 
.zip 

BONUS: con

find . -type f | egrep -i -E -o "\.{1}\w*$" | sort | uniq -c 

si otterrà il conteggio dei file:

106 .DS_Store 
    35 .MP3 
    89 .aif 
     5 .aiff 
    525 .asd 
     1 .doc 
    60 .flac 
    48 .jpg 
    149 .m4a 
    11 .m4p 
     1 .m4r 
    12844 .mp3 
     1 .pdf 
     5 .png 
     9 .txt 
    108 .wav 
    44 .wma 
     2 .zip 
1

È inoltre possibile utilizzare grep per trovare tutti i file con un'estensione specifica:

find .|grep -e "\.gz$" 

Il . indica la cartella corrente. Se si desidera specificare una cartella diversa dalla cartella corrente, è sufficiente sostituire lo . con il percorso della cartella. Ecco un esempio: Lascia per trovare tutti i file che terminano con .gz e si trovano nella cartella/var/log

find /var/log/ |grep -e "\.gz$" 

L'output è qualcosa di simile al seguente:

✘ ⚙> find /var/log/ |grep -e "\.gz$" 

/var/log//mail.log.1.gz 
/var/log//mail.log.0.gz 
/var/log//system.log.3.gz 
/var/log//system.log.7.gz 
/var/log//system.log.6.gz 
/var/log//system.log.2.gz 
/var/log//system.log.5.gz 
/var/log//system.log.1.gz 
/var/log//system.log.0.gz 
/var/log//system.log.4.gz 

Il $ segno sostanzialmente statistiche che l'estensione del file termina con gz