[gelöst] Verzeichnisse rekursiv durchlaufen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
mod3

[gelöst] Verzeichnisse rekursiv durchlaufen

Beitrag von mod3 » 05.05.2014 20:06:52

Hallo!

Möchte für alle Dateien unterhalb eines bestimmten Verzeichnisses eine Operation durchführen.
Bei chmod gibt's für sowas ja den Parameter -R, aber wie mache ich das in meinem Falle?
Muss ich die Rekursion dafür selbst implementieren? Und falls ja: Wie sieht soetwas aus?

Grüße
Zuletzt geändert von mod3 am 06.05.2014 16:18:57, insgesamt 1-mal geändert.

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Verzeichnisse rekursiv durchlaufen

Beitrag von smutbert » 05.05.2014 20:17:21

Ein Beispiel für alle mp3-Dateien unterhalb des momentanen Verzeichnisses

Code: Alles auswählen

find . -name "*.mp3" | xargs meinBefehl
das allerdings glaube ich an Leerzeichen im Pfad scheitert. Ich bin aber schon gespannt was noch für Vorschläge kommen ☺

kuerbis
Beiträge: 20
Registriert: 29.03.2014 12:06:40

Re: Verzeichnisse rekursiv durchlaufen

Beitrag von kuerbis » 05.05.2014 20:25:43

Code: Alles auswählen

find . -name "*.mp3" -exec mein_befehl '{}' \;
Startet für jede mp3-Datei unterhalb des aktuellen Verzeichnisses das Programm mein_befehl mit dem jeweiligen Dateinamen als Parameter. Vorteil: Dateinamen werden auch mit Leer- und anderen Sonderzeichen korrekt übernommen. Nachteile: Für jede Datei wird ein neuer Prozess gestartet und längere Befehlsketten wie Pipelines sind damit nur eingeschränkt möglich.
"There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies." (C.A.R. Hoare)

mod3

Re: Verzeichnisse rekursiv durchlaufen

Beitrag von mod3 » 05.05.2014 20:49:00

Ok und wie mache ich es für alle Dateien, egal welchen Typs?

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Verzeichnisse rekursiv durchlaufen

Beitrag von Cae » 05.05.2014 20:53:27

mod3 hat geschrieben:Ok und wie mache ich es für alle Dateien, egal welchen Typs?
In die Manpage gucken? Wenn du nicht auf den Namen matchen willst, lass' den Parameter dazu doch weg...

Letzendlich willst du vermutlich so etwas wie

Code: Alles auswählen

$ find /path -type f -exec 'echo {} >/dev/null' \;
oder
$ find /path -type f -print0 | xargs -0 grep -nI suchstring
Letzteres waere ein klassisches Aequivalent zu grep -r.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

mod3

Re: Verzeichnisse rekursiv durchlaufen

Beitrag von mod3 » 05.05.2014 22:05:10

Hm, stehe gerade auf dem Schlauch:

Code: Alles auswählen

find /pfad -type f -exec 'cat {}' \;
Bringt mir:

Code: Alles auswählen

find: "cat /pfad/datei.abc": Datei oder Verzeichnis nicht gefunden
Und das für jede einzelne Datei unterhalb von /pfad.
Warum das? Lesbar sind die Dateien doch offenbar?

wanne
Moderator
Beiträge: 7548
Registriert: 24.05.2010 12:39:42

Re: Verzeichnisse rekursiv durchlaufen

Beitrag von wanne » 05.05.2014 23:30:45

Du willst vermutlich dasda machen:

Code: Alles auswählen

find /pfad -type f -exec cat '{}' \;
Also das Programm "cat" auf die Datei "/pfad/datei.abc" ausführen und nicht das Programm "cat /pfad/datei.abc" ausführen. (Programme mit leerzeichen im namen gibt's nicht so viele :-) )
rot: Moderator wanne spricht, default: User wanne spricht.

newdeb
Beiträge: 134
Registriert: 03.02.2011 11:11:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Frankfurt

Re: Verzeichnisse rekursiv durchlaufen

Beitrag von newdeb » 06.05.2014 09:00:00

kuerbis hat geschrieben:Nachteile: Für jede Datei wird ein neuer Prozess gestartet und längere Befehlsketten wie Pipelines sind damit nur eingeschränkt möglich.
Läst sich optimieren (hängt vom exec-Befehl ab, er muss mehrere Argumente auf seiner Kommandozeile zulassen):
-exec Befehl {} +
Diese Variante der Aktion -exec führt den angegebenen Befehl für die ausgewählten Dateien aus, aber die Befehlszeile wird durch das Anhängen jeder ausgewählten Datei an das Ende gebildet; die Gesamtzahl der Befehlsaufrufe wird viel geringer sein, als die Anzahl passender Dateien. Die Befehlszeile wird auf die gleiche Weise wie bei xargs gebildet. Innerhalb des Befehls ist nur eine Instanz von »{}« erlaubt. Der Befehl wird im Startverzeichnis ausgeführt.

mod3

Re: Verzeichnisse rekursiv durchlaufen

Beitrag von mod3 » 06.05.2014 16:18:41

Ihr habt mir schon sehr geholfen, vielen Dank :-)

Antworten