这是一个棘手的问题。
我想不出一个好的解决方案。但是,这里有一个解决方案。请注意,如果您的目录或文件名包含换行符,则保证不起作用,如果它们包含其他特殊字符,则不保证起作用。(我只用你问题中的样本进行了测试。)
另外,我没有包括 a-maxdepth
因为你说你也需要搜索子目录。
#!/bin/bash
# Create an associative array
declare -A excludes
# Build an associative array of directories containing the file
while read line; do
excludes[$(dirname "$line")]=1
echo "excluded: $(dirname "$line")" >&2
done <<EOT
$(find . -name "*protein.fasta" -print)
EOT
# Walk through all directories, print only those not in array
find . -type d \
| while read line ; do
if [[ ! ${excludes[$line]} ]]; then
echo "$line"
fi
done
对我来说,这会返回:
.
./dir3
./dir4
所有这些都是不包含匹配文件的目录*.protein.fasta
。当然,您可以将最后一个替换为echo "$line"
您需要对这些目录执行的任何操作。
交替:
如果您真正要查找的只是在任何子目录中不包含匹配文件的顶级目录列表,则以下 bash 单行可能就足够了:
for i in *; do test -d "$i" && ( find "$i" -name '*protein.fasta' | grep -q . || echo "$i" ); done