2017-01-26 2 views
0

ich ein Verzeichnis in UNIX haben, die eine Tausende von .TGZ komprimierte Dateien hat, sie folgen diesem Muster:Shellscript - bei Verarbeitung Dateinamen Muster

01.red.something.tgz 
02.red.something.tgz 
03.red.anything.tgz 
04.red.something.tgz 
01.blue.something.tgz 
02.blue.everything.tgz 
03.blue.something.tgz 
04.blue.something.tgz 
01.yellow.something.tgz 
02.yellow.blablathing.tgz 
03.yellow.something.tgz 
04.yellow.something.tgz 

Sie verwenden eine große Menge aus dem Dateisystem, und ich brauche um sie aufzulisten, ohne die Datei selbst zu extrahieren. Eigentlich wird es etwas dauern, also glaube ich, dass dieses Shellscript dem Bedarf entsprechen wird. Ich bin irgendwie neu zu Shell, ich lerne, damit ich diese .sh gemacht

$pattern = "red" 

for file in *.tgz 
do 

    if [[ ${file} == '...${pattern}.*.tgz' ]]; then 
     echo" ==> ${file} match the pattern and the output dir is : out/" 
     tar -tf $file > ./out/$file 
    else 
     echo "${file} Doesn't match the pattern" 
    fi 
done 

Aber ich habe etwas falsch in dem wenn Teil gemacht, und selbst wenn das Muster abgestimmt ist, ich habe hat die 'Nicht stimmt mit der Muster' Nachricht überein.

Ich weiß, es ist ein bisschen einfach wenn, aber ich kann nicht verstehen, warum dieser Typ nicht funktioniert. Ich wäre dankbar, wenn ihr erklären könntet, warum das nicht funktioniert.

Vielen Dank.

+0

'==' ist nicht das Spiel Betreiber; Lies 'Globbing' nach und benutze '*. $ {pattern}. *. tgz' direkt in der For-Schleife. –

+0

Danke, ich werde eine Suche machen – Imkls

Antwort

1

müssen Sie für Räume beachten, wenn Sie varibales in bash zu erstellen, in if sollte es nicht sein ' - einfache Anführungszeichen oder " - doppelte Anführungszeichen, wenn Sie auf regex übereinstimmen soll,
Verwendung: if [[ ${file} == ${regEx} ]];

-Test :

$ ls *.tgz 
01.red.something.tgz 01.yellow.something.tgz 
$ ./t.sh 
==> 01.red.something.tgz match the pattern and the output dir is : out/ 
01.yellow.something.tgz Doesn't match the pattern 

$ cat t.sh 
#!/bin/bash 

pattern="red" 
regEx="*.${pattern}.*.tgz" 

for file in *.tgz 
do 
    if [[ ${file} == ${regEx} ]]; then 
     echo " ==> ${file} match the pattern and the output dir is : out/" 
     #tar -tf $file > ./out/$file 
    else 
     echo "${file} Doesn't match the pattern" 
    fi 
done 
+0

Danke Freund, es funktioniert wie ein Zauber. Ich habe das Konzept verstanden und werde es beim nächsten Mal wissen. :) – Imkls

+0

groß - in Betracht ziehen, dies als Antwort zu akzeptieren und oben abstimmen:) [Was soll ich tun, wenn jemand meine Frage beantwortet?] (Http://stackoverflow.com/help/someone-answers) –

Verwandte Themen