在继续之前检查文件是否在具有特定名称的文件夹中

Check if file is in a folder with a certain name before proceeding

所以,我有这个简单的脚本,可以将文件夹中的视频转换为 R4DS 可以播放的格式。

#!/bin/bash
scr='/home/user/dpgv4/dpgv4.py';mkdir -p 'DPG_DS'
find '../Exports' -name "*1080pnornmain.mp4" -exec python3 "$scr" {} \;

问题是,有些视频无效且无法播放,我已将这些视频移动到 Exports 文件夹中的其他目录。我想要做的是检查以确保文件在 运行 之前位于名为 new 的文件夹中 python 脚本,最好在 find 命令中。路径应如下所示:

../Exports/(anything here)/new/*1080pnornmain.mp4

请注意 (anything here) 文本并不表示单个目录,它可能类似于 foo/barfoo/b/arf/o/o/b/a/r

您不能使用 -name,因为搜索现在在路径上。我的第一个解决方案是:

find ./Exports -path '**/new/*1080pnornmain.mp4' -exec python3 "$scr" {} \;

但是,正如@dan 在评论中指出的那样,这是错误的,因为它不必要地使用了 globstar 通配符 (**):

This checks if /new/ is somewhere in the preceding path, it doesn't have to be a direct parent.

所以,这里的星星是不够的。另一种可能性,仅使用 find,可能是这个:

find ./Exports -regex '.*/new/[^\/]*1080pnornmain.mp4' -exec python3 "$scr" {} \;

这个正则表达式匹配:

  1. new.*/new
  2. 之前的任意数量的嵌套文件夹
  3. 任何字符(除了 / 以省略更多子路径)+ 您的文件名 [^\/]*1080pnornmain.mp4

性能可能会降低,因为它使用正则表达式。


通常,您应该选择将 find 输出的每一行传递给 xargs,而不是使用 find 命令的 -exec 选项,因为更多高效的线程生成,例如:

find ./Exports -regex '.*/new/[^\/]*1080pnornmain.mp4' | xargs -0 -I '{}' python3 "$scr" '{}'