如何查找某些文件存在但其他文件不存在的目录

Joh*_*hau 0 bash directory files

假设我有很多报告目录,而且我总是report.md在包含报告的目录中有一个文件,但report.pdf只有在完成的报告中。我想找到report.md存在但没有report.pdf.

reports_dir
|
+-- project_xyz
|   +-- report.md
|   +-- image.png
|
+-- bugs
|   +-- report.md
|   +-- report.pdf
|   +-- Makefile
|
+-- homework
    +-- report.pdf
    +-- test.md
Run Code Online (Sandbox Code Playgroud)

如果我将此函数用作search "reports_dir" --include "report.md" --exclude "report.pdf",它应该返回/project_xyz但不返回/bugs并且/homework

sh/ 中进行此类搜索的最快方法是什么bash?(首选单行)

Qua*_*odo 5

for f in "$1"/*/"$2"; do dir=$(dirname -- "$f"); [ -f "$dir/$3" ] || printf '%s\n' "$dir"; done
Run Code Online (Sandbox Code Playgroud)

将脚本另存为search. 第一个参数是父目录,第二个是包含,第三个是排除。

sh search "reports_dir" "report.md" "report.pdf"
Run Code Online (Sandbox Code Playgroud)
  • "$1"/*/"$2"仅获取report.md示例中文件的路径。

  • dir=$(dirname -- "$f") 获取这些文件的目录路径(假设它不以换行符结尾)。

  • [ -f "$dir/$3" ]测试该目录 ( report.pdf)中第三个参数中文件是否存在,并且它是常规类型(不是目录、fifo、设备...)。

  • || printf '%s\n' "$dir"如果它不存在(或不是常规文件),则打印目录名称。