我有一个名为“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'
对于其他find
s,提供的目录名称不包含换行符:
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