2017-04-20 1 views
0

Ich habe etwas Code geschrieben, um Dateien zu finden, die vom aktuellen Benutzer nicht lesbar sind. Es gibt mir Nachrichten, dass die Dateien in den Unterverzeichnissen des übergeordneten Ordners nicht gelesen werden können, obwohl ich explizit am Ende des Skripts außerhalb der Schleife für eine der Dateien, die es als nicht lesbar meldet, getestet habe. Allerdings habe ich überprüft und alle Dateien haben die Gruppenberechtigungen, um das Lesen zu ermöglichen, und ich habe vi verwendet, um mehrere von ihnen zu öffnen. Was geht hier vor sich?Bedingte Dateilogik in Linux

Script:

#!/bin/ksh 
set -A files $(ls -1 $1) 
echo "${#files[@]}" 

for((i=0; $i < ${#files[@]}; i++)); do 
    if [ ! $2 ${files[$i]} ]; then 
    echo "${files[$i]} not $2" 
    fi 
done 

echo "============" 
if [ ! -r ./tmp/feederseries.txt ]; then 
    echo "./tmp/feederseries.txt not readable" 
fi 

Ausgang:

$ testfiles.sh "*" -r 
212 
./buildhist: not -r 
20170109_124058.txt not -r 
20170109_124128.txt not -r 
./cmpatches: not -r 
tmp.txt not -r 
./reports: not -r 
archived not -r 
./tmp: not -r 
feederseries.txt not -r 
============ 
+0

nur 'ls hinzufügen - l $ {files [$ i]} 'um die Eingaben zu debuggen? Außerdem würden typical unix/linux cmd-line-Optionen erwarten, dass etwas wie "-r" der erste ist. Dann müssen Sie nicht "" * "zitieren, lassen Sie einfach die cmd-Zeile die Liste der zu verarbeitenden Dateien natürlich erweitern. Außerdem bin ich überrascht, dass die Ausgabe von "ls -l $ 1" "Dateien ..... in den Unterverzeichnissen des übergeordneten Ordners" enthält, glaube ich nicht. Vielleicht verstehe ich das falsch. Wäre besser, wenn Sie ein kleines 4-Datei-Beispiel mit 1 Unterverzeichnis mit 1 Datei erstellen würden, um das Problem zu testen. Viel Glück. – shellter

+0

Mit 'echo" $ i: $ {files [$ i]} "' zum debuggen der Eingabe in der for-Schleife zeigt ULick an, dass die Dateien in Unterverzeichnissen ohne ihre Unterverzeichnispfade in das Array eingegeben werden, also wann Der Dateitest ist abgeschlossen, es wird nach der Datei am falschen Ort gesucht. Wenn das Sternchen nicht zitiert wird, erweitert die Shell es, bevor es es dem Skript zuführt, was bedeutet, dass das '-r' das letzte Argument ist (d. H. Das Argument $ 213). Ich könnte wahrscheinlich die Reihenfolge der Argumente ändern, um zu verhindern, dass, wie Sie sagten, die Reihenfolge nicht typisch ist. –

+0

'ls -l' listet Unterverzeichnisse auf, wenn das Dateiargument' * 'ist. Da das Skript flexibel sein soll, um nach Mustern (d. H. "* .sh") oder allen Dateien suchen zu können, musste ich ihm ein Argument 'ls -l $ 1' geben; Dies bedeutet jedoch, dass ich, um nach allen Dateien zu suchen, etwas dem Argument zuweisen muss, das alle Dateien abfängt. Leider sagt dies auch "ls", um Unterverzeichnisse aufzulisten. –

Antwort

2

Ein Array ist nicht erforderlich, dies zu tun. Die Verwendung von ls zum Durchlaufen einer Dateiliste ist sowieso nicht die beste Idee. Eine Erläuterung finden Sie unter http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29.

Mit ls -1 * erhalten Sie eine Liste von Dateien im aktuellen Verzeichnis, den Unterverzeichnissen gefolgt von ':' und den Dateien in den Unterverzeichnissen. Die Dateien in Unterverzeichnissen werden als nicht lesbar gemeldet, da sie nicht im tatsächlichen Verzeichnis vorhanden sind (in dem Sie den Test ausführen).

Lassen Sie die Schale der Expansion kümmern und durchlaufen der Liste:

#!/bin/ksh 
for file in $1; do 
    if [ ! $2 $file ] ; then 
     echo "$file not $2" 
    fi 
done 

Wenn Sie nur die Dateien benötigen, die nicht lesbar sind, dies zu tun wäre:

find .. ! -perm /u=r -print 
+0

Danke für die Tipps, damit das Skript funktioniert. Ich stolperte tatsächlich über 'find' Fähigkeit, die Berechtigungen danach zu testen, aber ich bin froh, dass Sie mir nicht nur gesagt haben, dass ich' find' verwenden soll, da ich wissen wollte, wo mein Missverständnis bei der Erstellung dieses Skripts lag. Sie haben einige wichtige Punkte zum Durchlaufen von Dateien hervorgehoben, und der von Ihnen vorgeschlagene Link ist sehr hilfreich. Vielen Dank! –