Shellscript soll Datei in Verzeichnisse kopieren, es klappt aber nicht.

07/11/2007 - 09:36 von Pedro Santos | Report spam
Hallo,
ich probiere gerade eine Shell-Script, welches eine übergebene Datei in diverse Verzeichnisse
kopieren soll, irgendwas klappt daran nicht, ich vermute es liegt an den Zeilenumbrüchen :

Und dann hàtte ich noch eine Frage zu diesem Parameter von Find: -name "[!.]*"
Liege ich richtig damit, das es die versteckten Verzeichnisse, die keine Unterordner haben
nicht anzeigt? Wofür steht das ! in dem wildcard?


#-
# Aufruf / Anzahl der Aufrufparameter
#-
if [ $# != 1 ]
then
echo -e "Aufruf: $0 Datei"
exit 1
fi


#-
# Unterverzeichnisse ermitteln
#-
liste=$(find -type d -name "[!.]*")

zaeler=0
i=0

for dir in $liste
do
echo -e "$1 ${liste[$i]}"
cp "$1" `tr -d '' "${liste[$i]}"` && ((zaehler++))

i=$[ $i +1 ]
done
sync # Force changed blocks to disk, update the
# superblock

#-
# Kontrollausgabe
#-
echo -e "$zaehler Dateien kopiert"



Ich danke schonmal im Voraus.

Schöne Grüße

Pedro Santos
 

Lesen sie die antworten

#1 Juergen P. Meier
07/11/2007 - 10:13 | Warnen spam
Pedro Santos :
Hallo,
ich probiere gerade eine Shell-Script, welches eine übergebene Datei in divers
kopieren soll, irgendwas klappt daran nicht, ich vermute es liegt an den Zeile



Es waere nett, wenn du deine Zeilen deutlich unter 80 Zeichen/Zeile
halten koenntest. DAs erleichtert das Lesen der Postings

Und ja dein script ist noch nichtmal gegen Leerzeichen gewappnet.

Und dann hàtte ich noch eine Frage zu diesem Parameter von Find: -name "[!.]*"
Liege ich richtig damit, das es die versteckten Verzeichnisse, die keine Unter
nicht anzeigt? Wofür steht das ! in dem wildcard?



Fuer die logische Negation. Dieses Shell-Globbing Muster wird von
find so interpretiert, dass er auf alle Dateinamen zutrifft, die nicht
mit einem Punkt '.' beginnen.

if [ $# != 1 ]
then
echo -e "Aufruf: $0 Datei"
exit 1
fi
liste=$(find -type d -name "[!.]*")



Hier ist das erste Problem: Umbrueche, Leerzeichen und Tabulatoren in
Dateinamen werden durch die Zuordnung veraendert, und koennen nicht
laenger von Listentrennzeichen (Leerzeichen) unterschieden werden.

zaeler=0
i=0

for dir in $liste



Und hier fliegt das dann bei Daeinamen mit Leerziechen auf die
schnautze.

do
echo -e "$1 ${liste[$i]}"
cp "$1" `tr -d '' "${liste[$i]}"` && ((zaehler++))



Das funktionioert so ueberahupt nicht, weil tr nach der Datei namens
"${liste[$i]}" sucht, um /darin/ alle linefeeds zu loeschen.

i=$[ $i +1 ]
done



Verwende bitte fuer solche Aufgaben anstatt einer diskreten Schleife
die -exec Option von find:

find -type d -name "[!.]*" -exec cp "$1" {} \;

Der Einzeile hat auch den Vorteil, dass er resistent gegen Leerzeichen
in Dateinamen ist. Die Zahl der kopierten Dateien bekommst du raus,
indem du find noch -print sagst und die Ausgabe dieses Kommandos
an wc -l schickst.

find -type d -name "[!.]*" -print -exec cp "$1" {} \; | wc -l

HTH

Juergen P. Meier - "This World is about to be Destroyed!"
end
If you think technology can solve your problems you don't understand
technology and you don't understand your problems. (Bruce Schneier)

Ähnliche fragen