查找包含给定文件的目录?

Finding directories that contains given files?

我希望这是一个有趣的问题..我想找到一个包含所有给定文件的目录..到目前为止我所做的如下

在 unix 中查找多个文件...

find . -type f \( -name "*cache" -o -name "*xml" -o -name "*html" \)

参考:http://alvinalexander.com/linux-unix/linux-find-multiple-filenames-patterns-command-example

仅查找包含给定文件的目录...

find . -type f -name '*.pdf' |sed 's#\(.*\)/.*##' |sort -u

参考:http://www.unix.com/unix-for-dummies-questions-and-answers/107488-find-files-display-only-directory-list-containing-those-files.html

我如何创建一个命令给我一个包含所有给定文件的目录...(文件必须在给定目录中,而不是在子目录中..并且列表中给出的所有文件必须在场 )

想要搜索 WordPress 主题目录

您可以这样使用 find

find -type d -exec sh -c '[ -f "[=10=]"/index.php ] && [ -f "[=10=]"/style.css ]' '{}' \; -print

要搜索更多文件,只需将它们添加为 && [ -f "[=15=]"/other_file ]sh的return代码表示是否可以找到所有文件。仅当 sh 成功退出时才会打印目录名称,即找到所有文件后。

正在测试:

$ mkdir dir1
$ touch dir1/a
$ mkdir dir2
$ touch dir2/a
$ touch dir2/b
$ find -type d -exec sh -c '[ -f "[=11=]"/a ] && [ -f "[=11=]"/b ]' '{}' \; -print
./dir2

这里我创建了两个目录,dir1dir2dir2 包含这两个文件,因此它的名称被打印出来。

正如gniourf_gniourf在评论中提到的(谢谢),没有必要使用sh来做到这一点。相反,您可以这样做:

find -type d -exec test -f '{}'/a -a -f '{}'/b \; -print

[test 做同样的事情。这种方法使用 -a 而不是 && 来组合多个单独的测试,从而减少了正在执行的进程数。

为了回应您的评论,您可以将找到的所有目录添加到存档中,如下所示:

find -type d -exec test -f '{}'/a -a -f '{}'/b \; -print0 | tar --null -T - -cf archive.tar.bz2

-print0 选项打印每个目录的名称,以空字节分隔。这很有用,因为它可以防止名称中包含空格的文件出现问题。这些名称由 tar 读取并添加到 bzip 压缩的存档中。请注意 find 的某些版本不支持 -print0 选项。如果您的版本不支持它,您可以使用 -print(并删除 tar--null 选项),具体取决于您的目录名称。

您可以使用这个脚本:

#!/bin/bash

# list of files to be found
arr=(index.php style.css page.php single.php comment.php)
# length of the array
len="${#arr[@]}"

# cd to top level themes directory
cd themes

# search for listed files in all the subdirectories from current path
while IFS= read -d '' -r dir; do
   [[ $(ls "${arr[@]/#/$dir/}" 2>/dev/null | wc -l) -eq $len ]] && echo "$dir"
done < <(find . -type d -print0)