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

VIV*_*ANI 5 unix bash shell command find

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

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

find . -type f \( -name "*cache" -o -name "*xml" -o -name "*html" \)
Run Code Online (Sandbox Code Playgroud)

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

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

find . -type f -name '*.pdf' |sed 's#\(.*\)/.*#\1#' |sort -u
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能创建一个命令,它会给我一个包含所有给定文件的目录......(文件必须在给定的目录中,而不是在子目录中......并且列表中给出的所有文件必须存在)

想搜索 WordPress 主题目录

Tom*_*ech 5

你可以这样使用find

find -type d -exec sh -c '[ -f "$0"/index.php ] && [ -f "$0"/style.css ]' '{}' \; -print
Run Code Online (Sandbox Code Playgroud)

要搜索更多文件,只需将它们添加为&& [ -f "$0"/other_file ]. 的返回码sh表明是否可以找到所有文件。只有sh在成功退出后,即找到所有文件时,才会打印目录名称。

测试一下:

$ mkdir dir1
$ touch dir1/a
$ mkdir dir2
$ touch dir2/a
$ touch dir2/b
$ find -type d -exec sh -c '[ -f "$0"/a ] && [ -f "$0"/b ]' '{}' \; -print
./dir2
Run Code Online (Sandbox Code Playgroud)

在这里,我创建了两个目录,dir1以及dir2. dir2包含这两个文件,所以它的名字被打印出来。

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

find -type d -exec test -f '{}'/a -a -f '{}'/b \; -print
Run Code Online (Sandbox Code Playgroud)

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

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

find -type d -exec test -f '{}'/a -a -f '{}'/b \; -print0 | tar --null -T - -cf archive.tar.bz2
Run Code Online (Sandbox Code Playgroud)

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