2012-03-25 3 views
0

Ich habe ein Skript, um Flash-Dateien im Speicher zu identifizieren, um kopiert oder an ein Programm wie VLC für die Wiedergabe weitergegeben werden.Holen Sie sich Spaltendaten aus jeder Zeile der Ausgabe von ls -l

Das funktioniert gut, aber ich möchte es jede passende Datei zurückgeben, da es nur die erste zurückgibt.

Ich würde normalerweise so etwas wie ein multidimensionales Array tun, aber Bash hat diese nicht und selbst wenn, würde ich die Syntax nicht kennen.

Wie teile ich die Ausgabe nach Zeile auf und gebe dann den Wert [8] von jedem zurück?

+2

http://mywiki.wooledge.org/ParsingLs –

+0

Dann ist mein Problem wird „wie ein Array von Dateinamen von symbolischen Links erstellen auf/tmp/Ordner“ - das ist wahrscheinlich ein viel komplizierteres Problem. Aber da wir in den/proc/Verzeichnissen sind, werden alle Dateinamen einfache Ganzzahlen sein, so dass wir 'ls' ohne große Probleme parsen können. –

Antwort

0

Sie könnten awk für diesen Einsatz:

files=$(ls -l|awk -F"-> " '/\/tmp/{print $2}') 

Diese gar nicht ausfallsicher ist (die Ausgabe von ls Parsen der Regel nicht).

Ein sicherer Ansatz, wenn Ihr find wäre es unterstützt:

files=$(find . -type l -printf "%l\n") 

(Immer noch nicht sicher, wenn Sie Leerzeichen im Dateinamen haben.)

Diese ziemlich robust sein sollte, und geben Sie eine bash array zum boot:

IFS=$'\n' files=($(find . -type l -printf "%l\n"|grep /tmp)) 

(immer noch nicht mit Dateinamen, die \n enthalten.)

+0

Schöne Antworten, ich benutze eine Schleife mit readlink, es erlaubt mir nicht, die Ausgabe zu einem anderen Befehl richtig pipe (Weil es nicht 'cd'ing vor' echo'ing), aber es funktioniert. –

0

Dies behandelt auch mehrere Zeilen der Ausgabe von ps. Vielleicht können Sie mehr als einen Flash-Prozess haben?

#!/bin/sh 
for pid in $(ps aux | awk '/[f]lash/ && !/bin\/[f]lash/{print $1}); do 
    for file in /proc/$pid/fd/*; do 
     case $(readlink "$file") in 
      /tmp/*) echo "$file" ;; 
     esac 
    done 
done 
Verwandte Themen