PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit find alle Dateien mit bestimmten Endungen finden


Gast
2008-03-16, 12:48:27
Hallo,
ich möchte mit find alle Dateien in einem Ordner und dessen Unterordner finden die vom Typ jpg,gif,png,mpg,avi,mov,asf sind. Also alle gängigen Bildformate und Videos. Wie kann ich dem Find-Kommando denn eine Art regulärer Ausdruck mit den Alternativen übergeben? Ich habe schon gegoogelt, aber bei dem ganzen Tutorials wurde nie auf Alternativen eingegangen.

Mir reicht auch ein Beispiel wo einfach nach txt und doc oder so gesucht wird, dann bekomm ich das schon hin nach beliebig vielen zu suchen.


Danke.

Gast
2008-03-16, 12:56:33
Jetzt hab ich gerade den -regex Schalter entdeckt, hat sich also erledigt :)

Gast
2008-03-16, 13:03:50
Warum funktioniert folgender Ausdruck nicht?
find . -regex '.*(txt|gif)'
Irgendwie scheint er Probleme zu haben mit der Alternative, so finde ich gar nichts, aber
find . -regex '.*txt'
findet alle Textdateien.

Superguppy
2008-03-16, 13:36:10
So gehts:

find . -regex '.*[gif|txt]'

Edit: Doch nicht ... bringe es gerade auch nicht zusammen. :(

Gast
2008-03-16, 14:16:55
Ja ich auch nicht, ich hab nen kleines Workaround gebastelt:

#!/bin/sh
for type in gif jpg png #usw.
do
find . -regex ".*$type"
done



Jetzt hab ich allerdings ein Problem, ich hatte eigentlich vor die Ausgabe von diesem Aufruf an cp zu pipen, allerdings erwartet cp die Quellpfade als Kommandozeilen und ich konnte auf der Manpage nichts finden womit ich die Quellpfade per stdin oder Datei übergeben kann.
Gibt es eine einfache Möglichkeit das zu realisieren?
find_all|cp --parent --target-directory=~/Pics
funktioniert leider nicht, wobei find_all obiges Skript ist.

klutob
2008-03-16, 14:39:22
So müsste es gehen (ungetestet).

find /pfad \( -name \*.Dateiendung -o -name \*.Dateiendung \) -exec cp {} Pfad/ \;


Das "-o" steht für den Operator "or" hier läßt sich also eine schöne Kette erstellen.

/edit

so schiebt man die Daten in eine Datei

find /pfad \( -name \*.Dateiendung -o -name \*.Dateiendung \) -fprint Datei \;

Sk4tz
2008-03-16, 14:43:11
also ich muss sagen in windows geht das leichter :P

Gast
2008-03-16, 14:44:00
Danke, werde es gleich mal testen :)

Gast
2008-03-16, 14:53:02
So müsste es gehen (ungetestet).

find /pfad \( -name \*.Dateiendung -o -name \*.Dateiendung \) -exec cp {} Pfad/ \;


Das "-o" steht für den Operator "or" hier läßt sich also eine schöne Kette erstellen.

/edit

so schiebt man die Daten in eine Datei

find /pfad \( -name \*.Dateiendung -o -name \*.Dateiendung \) -fprint Datei \;

Das funktioniert, allerdings erhält es nicht die Ordnerstruktur, wie kann ich cp --parent als Parameter mitgeben?

klutob
2008-03-16, 15:08:38
Das funktioniert, allerdings erhält es nicht die Ordnerstruktur, wie kann ich cp --parent als Parameter mitgeben?

Es heißt doch cp --parents? Ansonsten müßte ein einfaches Erweitern reichen.


find /pfad \( -name \*.Dateiendung -o -name \*.Dateiendung \) -exec cp --parents {} Pfad/ \;

Der Linux Guru
2008-03-16, 15:11:29
So geht's:

find -name *.gif

Gast
2008-03-16, 15:17:19
Es heißt doch cp --parents? Ansonsten müßte ein einfaches Erweitern reichen.


find /pfad \( -name \*.Dateiendung -o -name \*.Dateiendung \) -exec cp --parents {} Pfad/ \;

Ja ich habe das s vergessen. Ok danke.


Übrigens ich weiß inzwischen wie ich mein ursprüngliches Problem lösen kann, nämlich mit xargs :)

Gast
2008-03-16, 15:52:43
Ok, jetzt bin ich schon sehr weit, jetzt fehlt nur noch 1 Schritt, und zwar hat die Ordnerstruktur sehr weit unten in vielen Ordnern einen maximg Ordner, ich möchte alle diese Ordner suchen und deren Inhalt in den Darüberliegenden Ordner verschieben, so dass maximg und sein ursprünglicher Inhalt im gleichen Ordner liegen.
Geht das mit exec?

Also so weit komme ich selber:
find /Pfad -type d -name maximg -exec ??? {} \;

Aber was muss in ??? rein, wie kann ich da ein mv Befehl einbauen der
mv maximg/* ..
ausführt?

Gast
2008-03-16, 16:00:51
Folgendes funktioniert nicht, da er an den target-directory Parameter aus irgendwelchen Gründen maximg anhängt.
find /Pfad -type d -name maximg -exec mv --target-directory=.. {} \;
Dann kommt die Meldung
mv: Verschieben von „/Pfad/maximg“ nach „../maximg“ nicht möglich: Das Verzeichnis ist nicht leer

Gibt es eine Möglichkeit zu Unterbinden, dass an den Parameter noch maximg angehängt wird?

Gast
2008-03-16, 16:14:16
Ich habe es jetzt mit folgendem Workaround gelöst:

#!/bin/sh
read line
while [ $? -eq 0 ]
do
mv $line/* "$line/.."
read line
done


Und die leeren Ordner einfach mit
find /pfad -name maximg -type d -exec rmdir {} \;
gelöscht :)

Gast
2008-03-16, 17:54:59
Die Konsole rockt einfach, ich hab jetzt mit Hilfe von etwas Shellscripting, sed, bc und identify von ImageMagick alle Bilder mit gleichem Seitenverhältnis in einen Unterordner gepackt der den Namen des Seitenverhältnisses trägt :)

Ich habe jetzt zwar sehr viel Zeit in das Ordnen der Bilder investiert, aber sehr viel gelernt und vor allem wäre ich mit Ordnerverschieben in Nautilus nie zum Ziel gekommen, da es einfach zu viele Dateien sind.

Gast
2008-03-22, 22:05:34
find . -regex '.*txt';find . -regex '.*gif'

so gehts am einfachsten

EcHo
2008-03-25, 12:58:03
also ich muss sagen in windows geht das leichter :P
Wie kann man den unter windows auf der Konsole alle Dateien anhand der Endungen finden? Das grafische Suchtool von Gnome ist im übrigen der Windows-Suche weit überlegen! Dein getrolle ist hier fehl am Platz!

Mr. Lolman
2008-03-25, 13:02:33
Wie kann man den unter windows auf der Konsole alle Dateien anhand der Endungen finden? Das grafische Suchtool von Gnome ist im übrigen der Windows-Suche weit überlegen! Dein getrolle ist hier fehl am Platz!

dir /s *.txt :ulol:

EcHo
2008-03-25, 13:45:20
dir /s *.txt :ulol:
Das ist nicht was gesucht wird...

edit:
Was du suchst, geht unter der shell gleichwertig mit find -name *.txt Wo der Vorteil bei der Windowsvariante ist, wird wohl dein Geheimnis bleiben.

(del)
2008-03-25, 14:31:16
find -regex '.*jpg\|.*JPG\|.*gif'

oder auch mit Hilfe von grep:

find * | grep '.jpg\|.JPG\|.gif'