• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Sonderzeichen in basch-Script bei 'ls -l'-Befehl

Hi zusammen,

gerade versuche ich mich an einem kleinen Script.

Vermutlich habe ich aktuell nicht die Ruhe..., denn
ich möchte einen $Pfad="/home/user01/Remote Daten/Daten/" analysieren
und führe dazu einen Befehl wie folgt aus:

ls $Pfad -l | egrep '^d' | awk '{print $9}' > /home/user01/$File_Name

Durch das Leerzeichen wird der Pfad nicht richtig erkannt und das
Kommando endet fehlerhaft.

Nun hab ich schon versucht
1. $Pfad="'/home/user01/Remote Daten/Daten/'"
2. ls "'"$Pfad"'" -l | egrep '^d' | awk '{print $9}' > /home/user01/$File_Name
3. innerhalb des Pfades mit dem \-Backslash zu arbeiten

Leider alles ohne Erfolg.

Habt ihr eine Idee?

vielen Dank und schönes Wochenende

Gruß

Punki
 
Auf der Shell kannst Du mit "\" Backslash-Zeichen arbeiten.

Im Script einfach die Variable in "Double Quote" setzen.
Beim Deklarieren und beim Verwenden der Variable.

Code:
$Pfad="/home/user01/Remote Daten/Daten/"

ls -l "$Pfad" | egrep '^d' | awk '{print $9}' > /home/user01/$File_Name
Grundsätzlich kannst Du immer die Variable in Double Quote setzen, das ist nie verkehrt....
 
A

Anonymous

Gast
HBtux schrieb:
Im Script einfach die Variable in "Double Quote" setzen.
Beim Deklarieren und beim Verwenden der Variable.

Code:
$Pfad="/home/user01/Remote Daten/Daten/"

ls -l "$Pfad" | egrep '^d' | awk '{print $9}' > /home/user01/$File_Name
Das löst zwar das Problem mit dem Path aber nicht das mit den Dateinnamen.

Prinzipell gilt folgendes:

  • # die Long-Ausgabe von ls ist nicht besonders gut geeignet für solche Analysen
    # neben Sonderzeichen konnen bei "ls -l" auch noch Datumsformate störend werden,
    # besser einer Befehlsoptionen suchen der genau das ausgeben, was man haben will.
    # stat und find sind bei so was ls vorzuziehen
    # bei ls in solchen Scripten möglichst immer mit Option "-Q" arbeiten
    # mal bei awk nachschlagen, (grep + awk) ist doppelt gemoppelt, kostet nur unnötige Rechneleistung und ist anfälliger als awk alleine.

also könnte das bei dir mit "ls -l" zB so hier funktionieren.
Code:
ls -lQ  "$PATH" | awk -F "\"" '/^d/ {print $2}'

Einschränktungen hier aber bei einer möglichen Weiterverarbeitung des Ergebnisses zB mit Leerzeichen am Dateianfang oder Dateiende und mit " [/b ]im Dateinamen in der Befehlszeile selbst.
Man merke: im Dateinamen ist in LINUX fast jedes Sonderzeichen erlaubt, außer "/" und "\0"

wenn man da wirklich in jedes Script immer alles beachten will, wie zB Zeilensprünge, Leerzeichen an jeder Position, Quatazeichen, Zeichenfolgen die woanders als "ESC-Sequenzen" gewertet werden, Steuerzeichen und andere nicht durckbare Zeichen, usw. wirds kompliziert.

robi
 
Hi zusammen,

also ich habe einiges versucht/überlegt und gegrübelt...
doch alles hat nichts genützt. Mit der Bash ist 'ls -l'-Verarbeitung
echt problematisch!

Die Infrormation mit -Q (die File-/Dir-Namen in doppelten Hochkommata zu bekommen)
hatte ich gedacht würde den Durchbruch bringen. Doch weit gefehlt. Zumindest nicht it
einer Ticky-Programmierung. Das Problem war denn dann, dass ich nach dem 1. Doppel-
Hochkomma gesucht habe (mit INDEX($0,'\"'), dann mir SUBSTR($0,$start_pos). Und
diese Position hat sich leider immer wieder verändert.

Egal - irgendwann war es mir zu dumm daran ohne Ergebnis weiterzukommen. Da ich auch
gerne PERL nutze.... habe ich dort einen zwei-Zeiler geschrieben, der nur die Dir-/File-
Namen ausgibt. Dies verarbeite ich dann weiter wie gewünscht. So war mein Problem
gelöst.

Mein Perl-Programm

#!/usr/bin/perl -w
#print "$ARGV[0]\n"; # listet den Übergabewert an
$DIR=$ARGV[0];
opendir(DIR,$DIR)||die"Fehler beim oeffnen des Directories $DIR";
while($name=readdir(DIR)) {
if ( substr($name,0,1) ne "." ) {
print "$name\n";
}
}

Nun noch der Aufruf des Perl-Programms:

"$program_pfad"/DIR_Inhalt_ausgeben.pl "$source_pfad" > "/home/$root_pfad/$File_Name"

$program_pfad = Directory wo sich das perl-Programm befindet
$source_pfad = welchen Pfad / welches Directory möchte ich angelistet haben
"/home/$root_pfad/$File_Name" = wohin werden die Informationen/Ausgaben aus dem Perl-Programm geschrieben


Dennoch vielen Dank für Eure Unterstützung.

Gruß

OlliP
 
Oben