Dateien in Unterordnern finden / Ergebnis in Variable speichern

H

henrik4u

Hallo,

ich bin noch ein totaler Newbie auf Unix, daher kenn ich mich noch nicht wirklich mit der Scriptsprache aus...

Mein Problem:
Ich möchte aus diversen Unterverzeichnissen Dateien in ein anderes Verzeichnis kopieren - jedoch nur Dateien, die einem ganz bestimmten Typ entsprechen (z.B. pdf oder doc-Dateien). Manchmal existieren die Dateien, manchmal aber auch nicht und ggf. habe ich auch keine Rechte mir ein Verzeichnis angeben zu lassen, bzw. muss direkt den genauen Pfad angeben.

Ein Lösungsvorschlag - mit Variablen-Fehler
Da die Ordner alle einer gleichen Struktur entsprechen und nummeriert sind (fast fortlaufend) habe ich einen Zähler eingebaut. Per Parameter geben ich den Dateityp an, nachdem ich suchen möchte:

Code:
mycounter=500
mydestination= $HOME"/documents/test/"
while [ $mycounter -le 800 ]
do     
        mycounter=`expr $mycounter + 1`
        mydocument=$mycounter"/meineordner/dokumente/*."$1
        myfolder="../"$mycounter
        if test -d $myfolder
                then 
                theorigin="find $verz" 2> /dev/null 
                if test -f $theorigin
                        then
                        cp $theorigin $mydestination
                fi
        fi  
done

Irgendwie funktioniert das jedoch nicht... hat einer einen Tipp?
 
hey henrik,

entweder steige ich noch nicht durch die verzeichnisstruktur, die du bearbeiten möchtest, oder meinst du eigentlich statt

Code:
theorigin="find $verz" 2> /dev/null

Code:
theorigin="find $mydocument" 2> /dev/null

und zum testen macht sich auch gut:
Code:
#!/bin/bash -x

sonst kann es auch noch die RegExpansion sein, wenn du die verhindern willst, dann nutze die einfachen 'nicht expandierenden' quotes

viel Glück..
 
Dein $verz ist nirgends definiert. Auf die Schnelle (ungeprüft):

Code:
mycounter=500
mydestination= $HOME"/documents/test/"
while [ $mycounter -le 800 ]
do     
        mycounter=`expr $mycounter + 1`
        verz=$mycounter"/meineordner/dokumente"
        myfolder="../"$mycounter
        if test -d $myfolder
        then
                find $verz -name "*.$1" -exec cp {} $mydestination \;
        fi  
done

Gruss, Phorus
 
Zuletzt bearbeitet:
Hallo
Wollte Gestern schon was dazu sagen, aber die Tele-hot-Offline hat mich nicht mehr gelassen. ;)

henrik4u schrieb:
Hallo,

ich bin noch ein totaler Newbie auf Unix, daher kenn ich mich noch nicht wirklich mit der Scriptsprache aus...
Macht nix, irgendwann fängt man halt mal an damit.
Auch du kannst das lernen, ist garnicht so schlimm.
henrik4u schrieb:
Ein Lösungsvorschlag - mit Variablen-Fehler
Da die Ordner alle einer gleichen Struktur entsprechen und nummeriert sind (fast fortlaufend) habe ich einen Zähler eingebaut. Per Parameter geben ich den Dateityp an, nachdem ich suchen möchte:

Code:
mycounter=500
mydestination= $HOME"/documents/test/"
while [ $mycounter -le 800 ]
do     
        mycounter=`expr $mycounter + 1`
        mydocument=$mycounter"/meineordner/dokumente/*."$1
        myfolder="../"$mycounter
        if test -d $myfolder
                then 
                theorigin="find $verz" 2> /dev/null 
                if test -f $theorigin
                        then
                        cp $theorigin $mydestination
                fi
        fi  
done

Irgendwie funktioniert das jedoch nicht... hat einer einen Tipp?

Ja, erster Tipp:
Schau dir mal den Unterschied zwischen folgenden zwei Zuweisungen an:
foo="ls -lA"; echo $foo;
ls -lA
foo=$(ls -lA); echo $foo;
/etc
/usr
...


Merkst du was ich meine?
Bei dir betrifft das z.B.
theorigin="find $verz" 2> /dev/null
Wenn du schon so vorgehen willst, dann verwende entweder $(Befehl) oder die Backtics `Befehl` !
Beides ist gleichwertig, aber Ersteres finde ich übersichtlicher.

Dann:
Die Variable $verz taucht hier nirgends auf, ist folglich undef!

Lösungsvorschlag von mir:
Wenn deine Verzeichnisse immer mit Ziffern beginnen, dann kannst du in der bash die Datei und Verzeichnis-Expansion nutzen:
Deshalb geht auch Folgendes, ohne einen Counter :
Angenommen die Ziffer ist 3-Stellig, und es können Leerzeichen in den Dateien vorkommen.
(Das sieht bei *.doc ja verdächtig danach aus ;) ).
Code:
[b]
ZIEL="/fo/bar";
for I in (find [0-9][0-9[0-9]/ -type f \( -iname "*pdf" -o -iname "*doc" \) -print0 2>/dev/null | xargs -0 -n1); do
echo "cp $I nach $ZIEL"; 
done
[/b]
In der bash Version >3.0 geht auch:
Code:
[b]
ZIEL="/fo/bar";
for I in (find {0..999}/ -type f \( -iname "*pdf" -o -iname "*doc" \) -print0 2>/dev/null | xargs -0 -n1); do
echo "cp $I nach $ZIEL"; 
done
[/b]
Das erspart dir das Testen und Zählen, da find nur existierende Dateien in existierenden Ordnern übergibt.

Das echo einfach entfernen, und die Variablen in Hochkomma setzen.

HTH
Gruß Wolfgang
 

Ähnliche Themen

mittels if abfrage datei nach variabelnwert durchsuchen

Variable aus Child-Prozess "Re-exportieren"

Löschroutine mit Überprüfung

rsync: Quelle größer als Ziel => "Archiv" aufteilen/splitten

Doppelte Dateien finden und löschen

Zurück
Oben