Nur "normale Dateien" anzeigen per ls

N

Nano

Foren As
Hi, folgendes problem :

Ich brauche ein Array mit allen Dateien ( ordinary Files ) im einem Ordner
allerdings nur die Name.
Leider konnte ich in der Manpage und auch bei google keine option finden um nur normale Dateien anzeigen zu lassen, also keine Directorys etc...
Ich weiss zwar das ich mittels :
Code:
 ls -l | grep '^-'

nur die normalen Dateien herausfiltern kann allerdings benötige ich alle weiteren informationen die duch -l mitausgeben werden nicht, sondern nur den Namen der Dateien.

Die entsprechende Ausgabe speichere ich in einem Array und verarbeite es dort weiter.

Daher meine Frage gibt es eine möglichkeit nur die Namen der normalen Dateien zu bekommen, oder alternativ die per ls -l | grep '^-' erhaltenen daten im array ohne grösseren aufwand nur auf den namen zu reduzieren
 
Was meinst du mit normale Dateien?

Alle Dateien findest du mit find.

Das gibt dir alle dateien (keine Verzeichnisse oder Links oder dev...)
Code:
find /path -type f

Willst du das auf diese eine Ebene beschränken (Keine Unterverz.) nutze zusätzlich -maxdepht 1

Oder ohne find - etwas umständlich
Code:
for i in *; do
    if [ -f "$i" ];
    then
    echo "$i ist Datei";
    fi
done

Gruß Wolfgang
 
find ist dein freund. mit der option "-type f" werden nur "normale dateien" gesucht/angezeigt.

Code:
find /dir/to/files -type f

oder gleich alle in ein array packen:

Code:
file_array=( $(find /dir/to/files -type f -exec printf "{} " \;) )

edit: huch, zu spät ):

edit: und mein post gilt natürlich für bash(GNU bash, version 3.2.25). bei anderen shells könnte das mit dem array durchaus anders aussehen...
 
ähm, lasse einfach den Parameter von "ls " weg.

ciao
 
Soso.
Wurde aber aus seinem Post nicht ersichtlich, oder hab ich was verpasst
("ohne Directorys etc.."?)?

ciao
 
erstmal vielen dank für die schnelle hilfe, der test per -f hat mein problem gelöst danke,
find sollte ich aus ristiktionsgründen nicht nutzen
das weglassen der parameter bei ls würde auch verzeichnis anzeigen die ja nicht mit rein sollen.
Was ich mit normalen Dateien meinte, die englische bezeichnung ist ordinary File, also keine links verweise ordner etc...

Eine frage habe ich allerdings noch wenn ich ls -l in ein Array speicher scheint dies unterteilt zu werden , daher vermute ich das die ausgabe von ls -l selbst ein 1 dimensionales array pro zeile ist, stimmt dies ? und wenn ja wie könnte ich dies dann in ein 2 dimensionales array casten um beispielsweise per array[$i][spaltennummer] auf eine variable zuzugreifen wie z.b owner oder timestamp etc
 
also erstmal: nein, das ist kein einzeiliges arrary. das ist einfach nur eine in spalten unterteilte textausgabe, wobei der "spaltenseparator" (:s) hier das leerzeichen ist. dieses hier:
Code:
arr=( $(ls -l) )
würde jeden string, der durch newline/whitespace char "alleine" steht als einzelnes element in das array hinzufügen. man könnte auch folgendes tun:
Code:
arr=( bla blub
foo bar hihi
x )
wie du siehst werden einfach die teile, die "zusammen kleben" (also nicht von whitespace/newline zeichen "unterbrochen" werden) als einzelne array-elemente initialisiert. mehr nicht. das mit dem mehrdimensionalen array, hm, also ich weiß nicht, ob die bash das kann. dieser code hier:
Code:
i=0
ls -l|while read line; do
   arr[i]=( "$line" )
   ((i++))
done
produziert die fehlermeldung: "cannot assign list to array member", was für mich so aussieht, als ob die bash keine mehrdimensionalen arrays unterstützt. aber ich könnte natürlich auch einfach einen syntax-fehler begangen haben. btw: der code würde eh nicht wirklich "funktionieren", da ein gepipetes kommando in einer neuen shell ausgeführt wird und somit das array für die mutter-shell garnicht "sichtbar" wäre... (oder gibts da 'nen gscheiten work-a-round?)

ANYWHO, nimm lieber awk um solche "spaltenbasierten" ausgaben zu parsen. (anstatt alles in arrays reinzuprügeln...)
 
Zuletzt bearbeitet:

Ähnliche Themen

Compileroptionen

Server-Monitoring mit RRDTool

Zurück
Oben