PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : "find" Ausgabe beschneiden



tetex
26-01-2011, 12:06
Hallo,

habe mit "find" folgende Ausgabe:

/home/sicherung/manual/
/home/sicherung/manual/01.01.11
/home/sicherung/manual/01.01.11_workspace_DEV1
/home/sicherung/manual/01.01.11_workspace_DEV2
/home/sicherung/manual/01.01.11_workspace_DEV3
/home/sicherung/manual/01.01.11_workspace_DEV4

/home/sicherung/manual/02.01.11_workspace_DEV1
/home/sicherung/manual/02.01.11_workspace_DEV2
/home/sicherung/manual/02.01.11_workspace_DEV3
/home/sicherung/manual/02.01.11_workspace_DEV4

Nun möchte ich nur alle Ordner innerhalb von 01.01.11 in ein Verzeichnis verschieben. Dachte eigentlich an folgende Zeile... was nicht funktioniert da er dann - natürlich - den ganzen Ordner "manual" in "/home/sicherung/auto/." verschiebt.


find /home/sicherung/manual/ -maxdepth 2 -type d -exec mv {} /home/sicherung/auto/. \;

Brauche dieses "auslassen" der überflüssigen Verzeichnisse wie,

/home/sicherung/manual/
/home/sicherung/manual/01.01.11
/home/sicherung/manual/02.01.11

in der Ausgabe von "find" sehr oft ... daher bin ich dankbar über jeden hilfreichen Post.

Grüße

John W
26-01-2011, 18:05
Mir ist nicht ganz klar, was du zu automatisieren versuchst, darum mal ein paar allgemeine Tipps:
Du kannst reguläre Ausdrücke zum Einschränken benutzen und die Benutzung von -mindepth 2 empfehle ich dann auch mal ;-)
Beispiele:


# Findet alles, was sowohl hallo als auch welt enthält (case-insensitive):
find -iname '*hallo*' -iname '*welt*'
# Findet alles, was hallo, aber nicht welt enthält:
find -iname '*hallo*' ! -iname '*welt*'
# Findet alles, was entweder hallo oder welt enthält:
find -iname '*hallo*' -o -iname '*welt*'
# Findet alles, was hallo oder nicht welt enthält:
find -iname '*hallo*' -o ! -iname '*welt*'
Suchbedingungen lässt sich mit Klammern ("(" und ")") auch anders verknüpfen.
Weiterer Tipp: Statt \; besser \+ benutzen, dann wird mv nicht so oft aufgerufen (es werden so viele Parameter wie möglich zusammengefasst; bei einigen Programmen nicht sinnvoll, bei mv aber recht nützlich).

Um die weiter helfen zu können, müsste man allerdings wissen, weshalb nur der Inhalt von 01.01.11 verschoben werden soll, also wodurch sich dieser Ordner dafür qualifiziert. Wenn nur der Inhalt von 01.01.11 verschoben werden soll, wäre der folgende Befehl am einfachsten:


mv /home/sicherung/manual/01.01.2011/{,.[^.]}* /home/sicherung/auto/.

Damit werden auch versteckte Dateien und Verzeichnisse in 01.01.2011 verschoben.

Ansonsten gibst am besten mal eine Anleitung im Stile eines Kochrezeptes.

tetex
26-01-2011, 20:53
Mir ist nicht ganz klar, was du zu automatisieren versuchst, darum mal ein paar allgemeine Tipps:
Du kannst reguläre Ausdrücke zum Einschränken benutzen und die Benutzung von -mindepth 2 empfehle ich dann auch mal ;-)
Beispiele:


# Findet alles, was sowohl hallo als auch welt enthält (case-insensitive):
find -iname '*hallo*' -iname '*welt*'
# Findet alles, was hallo, aber nicht welt enthält:
find -iname '*hallo*' ! -iname '*welt*'
# Findet alles, was entweder hallo oder welt enthält:
find -iname '*hallo*' -o -iname '*welt*'
# Findet alles, was hallo oder nicht welt enthält:
find -iname '*hallo*' -o ! -iname '*welt*'
Suchbedingungen lässt sich mit Klammern ("(" und ")") auch anders verknüpfen.
Weiterer Tipp: Statt \; besser \+ benutzen, dann wird mv nicht so oft aufgerufen (es werden so viele Parameter wie möglich zusammengefasst; bei einigen Programmen nicht sinnvoll, bei mv aber recht nützlich).

Um die weiter helfen zu können, müsste man allerdings wissen, weshalb nur der Inhalt von 01.01.11 verschoben werden soll, also wodurch sich dieser Ordner dafür qualifiziert. Wenn nur der Inhalt von 01.01.11 verschoben werden soll, wäre der folgende Befehl am einfachsten:


mv /home/sicherung/manual/01.01.2011/{,.[^.]}* /home/sicherung/auto/.

Damit werden auch versteckte Dateien und Verzeichnisse in 01.01.2011 verschoben.

Ansonsten gibst am besten mal eine Anleitung im Stile eines Kochrezeptes.

Sorry ... es sollen auch die Inhalte von 02.01.2011 verschoben werden.

John W
27-01-2011, 06:27
mv /home/sicherung/manual/[0-9][0-9].[0-9].[0-9][0-9][0-9][0-9]/{,.[^.]}* /home/sicherung/auto/.
Dabei werden soeben verschobene Dateien aber nicht überschrieben (Beispiel: ist in 01.01.2011 etwas enthalten und in 02.01.2011 eine Datei mit gleichem Namen, bleibt die Datei in 02.01.2011 wo sie ist).

tetex
27-01-2011, 10:08
Hi,

danke für eure Antworten.... habe es jetzt doch mit zwei Schleifen gelöst und es geht sogar sehr fix trotz den 37000 Ordnern...

DIRLIST=`ls -d /home/sicherung/manual/*/`
for PATHTODIR in ${DIRLIST}; do
MOVELIST=`ls -d ${PATHTODIR}*/`
for PATHTOMOVE in ${MOVELIST}; do
mv ${PATHTOMOVE} ${ABSOLUTESAVEPATH}/.
done
done

Überschrieben wird hierbei nicht. Das ist auch so gewollt.

Gruß