2016-10-27 15 views
0

Haben Sie eine Anzahl von Dateien in einem Verzeichnis, das ich verarbeiten möchte. Jede Datei hat einen Namen, den ich verwenden muss, um einen NAME-Wert festzulegen, und jede Datei enthält eine Liste von IP-Adressen, an denen ich etwas tun muss.Bash While Read

 #!/bin/bash 
    TMPDIR=/usr/customer/scripts/tmp 
    ip_targets(){ 
     OLD_IFS=$IFS 
     while IFS= read -r file_name; do 
      log "This is: $file_name" 
     done < "$(find "$TMPDIR" -regex '.*.vms$')" 
     IFS=$OLD_IFS 
    } 
    ip_targets 

Wenn ich laufen:

$find /usr/customer/scripts/tmp -regex '.*.vms$' 

ich:

/usr/customer/scripts/tmp/XXX.vms 
/usr/customer/scripts/tmp/YYY.vms 

von denen jeder hat eine Liste von IP-Adressen.

Wenn ich das Skript ausführen, erhalte ich:

$ bash -x tester.sh 
+ TMPDIR=/usr/customer/scripts/tmp 
+ ip_targets 
+ OLD_IFS=' 
' 
++ find /usr/customer/scripts/tmp -regex '.*.vms$' 
++ find /usr/customer/scripts/tmp -regex '.*.vms$' 
tester.sh: line 4: /usr/customer/scripts/tmp/XXX.vms 
/usr/customer/scripts/tmp/YYY.vms: No such file or directory 
+ IFS=' 
' 

Erstens würde Ich mag Lage sein, den Namen ohne Pfad nur die Datei zu übergeben, noch Verlängerung.

Zweitens möchte ich einen weiteren Abschnitt hinzufügen, der dann ermöglicht, einen Befehl an jede der IPs in jeder Datei ausgegeben werden.

+0

könnten Sie einfach 'cat/Benutzer/Kunde/Skripte/tmp/*. vms | , damit Sie nicht mit Loops affen müssen? – JNevill

+0

@JNevill - Ich muss wirklich verstehen, wie man es während des Lesens macht, da die eigentliche Sache, die ich tun muss, nicht so einfach ist. – dross

+0

Da Sie 'while IFS =' verwenden, brauchen Sie 'OLD_IFS' nicht. –

Antwort

1

Sie hängen den Satz von Dateien an eine lange Zeichenfolge an.

< "$(find "$TMPDIR" -regex '.*.vms$')" 

Sie sollten 1 Datei streamen. Dies kann wie

< <(cat $(find "$TMPDIR" -regex '.*.vms$')) 

EDIT von etwas getan werden, wenn Sie die Dateinamen möchten und nicht den Inhalt, machen Sie eine virtuelle Datei mit den Dateinamen (Prozess Substitution) mit

< <(find "$TMPDIR" -regex '.*.vms$') 
+0

Wenn ich dies versuche, bekomme ich den Inhalt jeder Zeile jeder Datei analysiert. Ich muss zuerst den Namen jeder Datei analysieren. – dross

+0

Entschuldigung, ich habe meine Antwort bearbeitet. –

Verwandte Themen