我有一个大型项目,我正在尝试查找不包含*_out.csv
文件的目录。我看过其他类似的答案,我想我快到了。
我遇到的问题是我只想查看正在进行的目录,analysis/
但我也不想查看一些也进行分析的特定目录。
我设置了一个小示例问题:
$ tree
.
├── case1
│ ├── analysis
│ │ ├── test1
│ │ │ ├── gold
│ │ │ └── test1_out.csv
│ │ └── test2
│ └── doc
└── case2
├── analysis
│ ├── test3
│ │ └── gold
│ └── test4
│ └── test4_out.csv
└── doc
12 directories, 2 files
我不想查看标题为*/doc/*
或的目录*/gold/*
。我当前的命令是:
find . -type d -not -name "doc" -not -name "gold" '!' -exec test -e "{}/*_out.csv" ';' -print
结果是:
.
./case1
./case1/analysis
./case1/analysis/test1
./case1/analysis/test2
./case2
./case2/analysis
./case2/analysis/test3
./case2/analysis/test4
我理想的输出看起来像
./case1/analysis/test2
./case2/analysis/test3
如您所见,我当前find
的命令排除了doc
andgold
目录,但不排除有*_out.csv
文件的目录,也不排除不继续的目录analysis/
。
因此,您要查看表单的目录
*/analysis
,不包括某些子目录。与其搜索下的所有内容
.
,不如仅搜索下*/analysis
。要排除子目录,请使用
-prune
. 这是一个告诉 find 不要递归遍历该子目录的操作。最后,要测试是否存在与模式匹配的文件,您需要调用 shell。您
test
直接从调用find
,但test
不进行模式匹配,因此它仅测试名称包含文字*
字符的文件的存在。调用sh
,将目录名称作为参数传递给它:-exec sh -c '…' {} \;
. 在 sh 代码中,展开一个通配符生成匹配文件列表,并检查是否存在至少一个文件。(我假设没有名称以 . 结尾的悬空符号链接
_out.csv
。)你的任务是这个问题的副本。相同的策略将起作用:
找到你所有的 *_out.csv 文件,去掉 basename 和 uniq 列表。
找到您希望有 *_out.csv 文件的所有目录,然后从步骤 2 的列表中删除列表 1 中的条目。
此脚本使用输出描述符执行此操作:
稍微浓缩一下,可能就是: