J'ai un dossier parent nommé "parent_folder" avec beaucoup de sous-dossiers, dans ces sous-dossiers se trouve un fichier nommé "foo.mp4".
Je peux trouver ces fichiers facilement en faisant ceci:
mymacbook:parent_folder username$ find ./ -name "foo.mp4" -exec echo {} \;
Maintenant, cela renvoie le chemin de chaque fichier, par rapport à parent_folder /
./path/to/foo.mp4
Comment puis-je retourner uniquement le chemin, sans le nom de fichier?
-printf
%h
principaux répertoires du nom du fichier (tous sauf le dernier élément). Si le nom de fichier ne contient aucune barre oblique (car il se trouve dans le répertoire en cours), le spécificateur% h se développe en "." .find ./ -name "foo.mp4" -printf "%h\n"
affichera le chemin d'accès à chaque fichier trouvé (un par ligne). De plus, comme d'habitude, personne n'utilise-exec echo {}
donc il y a-print
(défaut même omis) ouprintf
action.-printf
est uniquement GNU. L'OP mentionne OS / X (un système BSD).Réponses:
Avec
GNU
find:Avec les autres
find
s, les noms de répertoire fournis ne contiennent pas de caractères de nouvelle ligne:Ou:
bien que cela signifie exécuter une
dirname
commande par fichier.Si vous devez exécuter une commande à ce sujet
path
, vous pouvez le faire (syntaxe standard):Bien que dans ce cas, vous puissiez utiliser
-execdir
(une extension BSD également disponible dans GNUfind
), qui se trouvechdir()
dans le répertoire du fichier:Attention cependant, bien que l'implémentation GNU de
find
s'étende{}
jusqu'à./filename
ici, celles de BSD s'étendent jusqu'àfilename
. C'est OK ici car le nom de fichier est passé comme argument à une option et est toujours defeatured.mp4
toute façon, mais pour d'autres utilisations, vous devrez peut-être tenir compte du fait que le nom de fichier peut commencer par-
ou+
(et être compris comme une option par la commande) ou contenir=
(et être compris comme une affectation de variable par awk par exemple), ou d'autres caractères causant ce genre de problèmeperl -p/n
(mais pas tous corrigés parfind
le./
préfixe de GNU dans ce cas), etc., dont vous devrez peut-être tenir compte .la source
find .
, vous aurez comme dirname. au lieu du chemin entier.find ./ -name "featured.mp4" -exec ffmpeg -i "{}" -c:v libvpx -b:v 1M -c:a libvorbis [NEED DIRECTORY HERE] featured.webm \;
J'utilise la deuxième suggestion que vous avez mentionnée.La commande ci-dessous peut également être utilisée pour récupérer uniquement les détails du répertoire.
la source