2017-04-05 4 views
0

Gibt es eine Möglichkeit, die Ausgabe von find (einige Argumente) zu wenigen Variablen zu speichern? Was ich tun muss, ist, die Ausgabe von find zu nehmen und sie als Eingabe für while zu verwenden und auch zu lesen. Ich kann den Test nicht mit -r -w oder -x verwenden (es ist eine akademische Übung).Bash finden | während lesen - einige Variablen

Etwas wie folgt aus:

find $1 -writable -printf "%f %p\n" , -readable -printf "%f %p\n" , -executable -printf "%f %p\n" | while read var1 var2 var3 
do 

    echo $var1 
    echo $var2 
    echo $var3 

done 

In var1 ich nur beschreibbare Dateien haben wollen, var2 lesbar, var3 ausführbar. Stattdessen ist alles in var1.

+0

Warum nicht gehen den einfachen Weg mit drei verschiedenen 'find' Befehle verwendbar könnte? Warum drei Datenströme kombinieren, um sie auseinander zu nehmen? – Jens

+0

Ich kann nicht mehr als einen Fund in Übung verwenden. Wie auch immer, ich habe die Antwort bekommen. - read nimmt eine Zeile von dem, was eingegeben wird, und arbeitet damit. Wenn also find Dateien mit neuen Zeilenzeichen druckt, geht es immer nur zu einer Variablen. Anstatt las var1 var2 var3 direkt nach while, nachdem ich var1 nach while gelesen und var2 gelesen haben sollte, las var3 innerhalb der Schleife. Verwenden Sie also grundsätzlich mehr als nur einen Lesevorgang, wenn die Eingabe mit neuen Zeilen gedruckt wird. – zderzak678

Antwort

1

Verstehen Sie Ihre Übung nicht, aber vielleicht so etwas wie für Start

while IFS= read -r -d '' file; do 
    [[ -w "$file" ]] && f_wrt+=("$file") 
    [[ -r "$file" ]] && f_rdr+=("$file") 
    [[ -x "$file" ]] && f_exe+=("$file") 
done < <(find . -maxdepth 1 -type f -print0) 

printf "writeable : %s\n" "${f_wrt[@]}" 
printf "readable : %s\n" "${f_rdr[@]}" 
printf "executable : %s\n" "${f_exe[@]}"