bash find:获取找到文件的目录


12

我有一个名为“ parent_folder”的父文件夹,其中包含许多子文件夹,在这些子文件夹中是一个名为“ foo.mp4”的文件。

通过执行以下操作,我可以轻松找到这些文件:

mymacbook:parent_folder username$ find ./ -name "foo.mp4" -exec echo {} \;

现在返回相对于parent_folder /的每个文件的路径

./path/to/foo.mp4

我怎么能只返回路径,而没有文件名?


1
man findACTIONS):-printf %h 文件名的前导目录(除了最后一个元素以外的所有目录)。如果文件名不包含斜杠(因为它在当前目录中),则%h说明符将扩展为“”。
Costas 2015年

你能举个例子吗?我应该将它放在“ -exec”之后还是之前?
dubbelj 2015年

find ./ -name "foo.mp4" -printf "%h\n"将为每个找到的文件打印路径(逐行)。与往常一样,没有人使用,-exec echo {}因此有-print(默认甚至被省略)或printf动作。
Costas

2
@Costas,-printf仅适用于GNU。OP提到的OS / X(BSD系统)。
斯特凡Chazelas

@StéphaneChazelas谢谢。我不知道OS / X(BSD)的这种限制。可怜的可怜的mac用户!
Costas

Answers:


20

GNU查找:

 find . -name foo.mp4 -printf '%h\n'

对于其他finds,提供的目录名称不包含换行符:

 find . -name foo.mp4 | sed 's|/[^/]*$||'

要么:

 find . -name foo.mp4 -exec dirname {} \;

尽管这意味着dirname每个文件运行一个命令。

如果需要在上运行命令path,则可以执行(标准语法):

 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 {} +

尽管在这种情况下,您仍可以使用-execdir(在GNU中也有BSD扩展名find),它chdir()位于文件目录中:

 find . -name "featured.mp4" -execdir \
   ffmpeg -i {} -c:v libvpx -b:v 1M -c:a libvorbis . featured.webm \;

请注意,尽管的GNU实现find将扩展{}./filename此处,而BSD的扩展到filename。可以,因为文件名是作为参数传递给选项的,并且始终可以featured.mp4,但是对于其他用途,您可能必须考虑文件名可以以-+(并被命令理解为选项)或包含=(和被理解为AWK例如变量赋值),或其它字符导致这种问题perl -p/n(不是全部由GNU固定find./前缀,但在这种情况下),等等,你可能要考虑。


当您申请时find .,您将拥有dirname。而不是整个路径。
PersianGulf 2015年

现在我将如何翻译成这个?find ./ -name "featured.mp4" -exec ffmpeg -i "{}" -c:v libvpx -b:v 1M -c:a libvorbis [NEED DIRECTORY HERE] featured.webm \; 我正在使用您提到的第二个建议。
dubbelj 2015年

@ MohsenPahlevanzadeh,OP并没有要求绝对路径,而是要求路径的目录名。
斯特凡Chazelas

@StéphaneChazelas对不起,请投票。
PersianGulf 2015年

谢谢@StéphaneChazelas。您帮助我制作了一个ffmpeg队列/批处理
dubbelj 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.