我希望这是一个有趣的问题..我想找到一个包含所有给定文件的目录。到目前为止我所做的工作如下
在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#\(.*\)/.*#\1#' |sort -u
如何创建一个命令,它将为我提供一个包含所有给定文件的目录...(这些文件必须位于给定目录中,而不是在子目录中..并且列表中给出的所有文件必须存在)
想要搜索WordPress主题目录
答案 0 :(得分:3)
您可以像这样使用find
:
find -type d -exec sh -c '[ -f "$0"/index.php ] && [ -f "$0"/style.css ]' '{}' \; -print
要搜索更多文件,只需添加&& [ -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
我在这里创建了两个目录dir1
和dir2
。 dir2
包含两个文件,因此会打印其名称。
正如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
(并删除--null
选项tar
),具体取决于您的目录名称。
答案 1 :(得分:1)
您可以使用此脚本:
#!/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)