Mit GNU
find:
find . -name foo.mp4 -printf '%h\n'
Bei anderen find
s enthalten die angegebenen Verzeichnisnamen keine Zeilenumbrüche:
find . -name foo.mp4 | sed 's|/[^/]*$||'
Oder:
find . -name foo.mp4 -exec dirname {} \;
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):
find . -name "featured.mp4" -exec sh -c '
for file do
dir=${file%/*}
ffmpeg -i "$file" -c:v libvpx -b:v 1M -c:a libvorbis "$dir" featured.webm
done' sh {} +
In diesem Fall können Sie möglicherweise Folgendes verwenden -execdir
(eine BSD-Erweiterung, die auch in GNU verfügbar ist find
), die sich chdir()
im Verzeichnis der Datei befindet:
find . -name "featured.mp4" -execdir \
ffmpeg -i {} -c:v libvpx -b:v 1M -c:a libvorbis . featured.webm \;
Beachten Sie jedoch, dass während die GNU-Implementierung von find
hier erweitert wird , die BSD- Implementierung {}
auf ./filename
hier erweitert wird filename
. Hier ist es in Ordnung, da der Dateiname als Argument an eine Option übergeben wird und dies immer featured.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 durch find
das ./
Präfix von GNU behoben ) usw., die Sie möglicherweise berücksichtigen müssen .
-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. .