我正在寻找一个单行命令来查找单个目录包含的多个文件或目录。
foo -> bar
-> baz
-> quux
temp -> bar
我想找到的只是foo
因为它包含bar
、、baz
和quux
,但找不到temp
。
由于其他原因,我必须使用tcsh
这个。
有什么建议么?
答案1
这应该可以满足您的要求,并且可以使用提供的数据
find . -type d -exec test -e '{}'/bar -a -e '{}'/baz -a -e '{}'/quux \; -print
它基本上会找到目录,然后检查它们是否包含相关文件。如果包含,它会打印名称。它在 bash 和 tcsh 中工作。
答案2
一种方法是使用 ,特别是如果您需要多次查找此信息mlocate
。安装 后mlocate
,您必须运行sudo updatedb
来填充索引数据库。未来的重新索引由每日 cron 作业触发(在许多流行的 Linux 发行版中默认配置)。
当您拥有最新的索引时,您可以运行如下查询:
locate -r '^/.*/foo/\(bar\|baz\|quux\)$'
上述命令将从根(/
)向下搜索所有内容,并打印如下内容:
/home/foo/bar
/home/foo/baz
/var/lib/foo/quux
/usr/local/foo/bar
答案3
有多种方法可以定位文件。例如:找到名为“foo”的目录,并列出其中的所有内容:
find . -name "foo" -type d | xargs ls -la
另一个选项,如果你已经tree
安装了命令(sudo apt-get install -y tree
):
find . -name "foo" -type d | xargs tree -afi
将为-afi
您提供所有文件(-a
)、完整文件路径(-f
)并丢弃缩进(-i
)。
答案4
尝试查找所有目录并查看它们是否包含您的三个文件/目录:
find -type d -print0 | xargs -0 -I@@ sh -c '[ -e @@/a ] && [ -e @@/b ] && [ -e @@/c ] && echo @@'