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

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

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

我可以通过这样做轻松找到这些文件:

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

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

./path/to/foo.mp4

如何仅返回路径而不返回文件名?

答案1

GNU查找:

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

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

find . -name foo.mp4 |
  LC_ALL=C 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如此,但对于其他用法,您可能必须考虑到文件名可能以-or开头+(并被命令理解为选项)或包含=(例如,可以理解为 awk 的变量赋值),或其他导致这种问题与perl -p/n(尽管在这种情况下,并非所有这些都由 GNUfind./前缀修复)等。

答案2

下面的命令也可用于仅获取目录详细信息。

find ./ -name "foo.mp4" | rev | cut -d"/" -f2- | rev

相关内容