Ich habe einen übergeordneten Ordner mit dem Namen "parent_folder" mit vielen Unterordnern. In diesen Unterordnern befindet sich eine Datei mit dem Namen "foo.mp4".
Ich kann diese Dateien leicht finden, indem ich dies tue:
mymacbook:parent_folder username$ find ./ -name "foo.mp4" -exec echo {} \;
Dies gibt nun den Pfad jeder Datei relativ zu parent_folder / zurück
./path/to/foo.mp4
Wie kann ich nur den Pfad ohne den Dateinamen zurückgeben?
-printf
%h
Führende Verzeichnisse des Dateinamens (alle bis auf das letzte Element). Wenn der Dateiname keine Schrägstriche enthält (da er sich im aktuellen Verzeichnis befindet), wird der% h-Bezeichner auf "" erweitert. .find ./ -name "foo.mp4" -printf "%h\n"
druckt den Pfad für jede gefundene Datei (zeilenweise). Darüber hinaus verwendet wie üblich niemand,-exec echo {}
daher gibt es-print
(Standard sogar weggelassen) oderprintf
Aktion.-printf
ist nur GNU. Das OP erwähnt OS / X (ein BSD-System).Antworten:
Mit
GNU
find:Bei anderen
find
s enthalten die angegebenen Verzeichnisnamen keine Zeilenumbrüche:Oder:
Dies bedeutet jedoch, dass ein
dirname
Befehl pro Datei ausgeführt wird.Wenn Sie dazu einen Befehl ausführen müssen
path
, können Sie Folgendes tun (Standardsyntax):In diesem Fall können Sie möglicherweise Folgendes verwenden
-execdir
(eine BSD-Erweiterung, die auch in GNU verfügbar istfind
), die sichchdir()
im Verzeichnis der Datei befindet:Beachten Sie jedoch, dass während die GNU-Implementierung von
find
hier erweitert wird , die BSD- Implementierung{}
auf./filename
hier erweitert wirdfilename
. Hier ist es in Ordnung, da der Dateiname als Argument an eine Option übergeben wird und dies immerfeatured.mp4
ist. Bei anderen Verwendungen müssen Sie jedoch möglicherweise berücksichtigen, dass der Dateiname mit-
oder beginnen kann+
(und vom Befehl als Option verstanden wird) oder enthält=
(und zum Beispiel von awk als variable Zuweisung verstanden werden) oder andere Zeichen, die diese Art von Problem verursachenperl -p/n
( in diesem Fall jedoch nicht alle durchfind
das./
Präfix von GNU behoben ) usw., die Sie möglicherweise berücksichtigen müssen .quelle
find .
, haben Sie als Dirname. statt des ganzen Weges.find ./ -name "featured.mp4" -exec ffmpeg -i "{}" -c:v libvpx -b:v 1M -c:a libvorbis [NEED DIRECTORY HERE] featured.webm \;
Ich verwende den zweiten Vorschlag, den Sie erwähnt haben.Der folgende Befehl kann auch verwendet werden, um nur die Verzeichnisdetails abzurufen.
quelle