如何列出包含文件的目录?

如何列出包含文件的目录?

我正在尝试使用 find 列出包含某个文件的目录,但是我的目录有空格,所以我还没有找到解决方案。

答案1

假设我真的理解你的问题,你是否尝试过:

find / -name "*what*" -exec dirname {} \;

即使我的目录中有空格,这也适用于我:

root:~# find / -name "*what*" -exec dirname {} \;
/usr/share/man/id/man1
...
...
/usr/share/man/ja/man1
/usr/share/man/it/man1
/usr/share/man/man1
/usr/bin
/root/This is a Spaced Dir

答案2

这是来自 fedora .bashrc 文件:

ff () {
       find . -name "*$@*" -print;
       }

将其添加到你的bash shell 中.bashrc,然后重新初始化你的 bash shell

现在你可以使用ff <whatever > \ <whatever>

\转义特殊字符的转义序列。

答案3

POSIX 规定了一个相当弱的选项find(说真的,它甚至没有 -print0)。同样,xargs 没有选项-0,而 IEEE 1003.1-2008 认为xargs -I {}它是一个 X/Open 系统接口扩展(两者都声明了一个字符串来替换参数将 xargs 转换为使用换行符作为输入参数分隔符)。因此,假设您确实想要做一点事除了打印出来之外,路径名还有其他用途,如果您只能使用基本 POSIX,则需要在将它们传递给 xargs 之前转义字符串中的空格,因此:

find /startingdir -name 'file name' -exec dirname {} \; | sed 's/ /\\ /g' | xargs command

请注意,如果您的目录包含引号和反斜杠,您还需要转义它们。这可以替代 sed 命令:

sed -e 's/\\/\\\\/' -e 's/ /\\ /g' -e 's/"/\\"/g' -e "s/'/\\\\'/g"

(请注意双引号脚本上的额外反斜杠。单引号字符串按字面意思使用反斜杠,但双引号字符串将解释反斜杠,因此您的 shell 将解释"\\\\"\\sed 需要文字\,而 则'\\\\'解释为\\\\sed 需要文字\\。)这将首先转义现有的反斜杠,然后转义空格、双引号和单引号。

如果您可以使用 X/Open 系统接口扩展,那么第一个版本(没有引号或反斜杠)简化为:

find /startingdir -name 'file name' -exec dirname {} \; | xargs -I {} command {}

如果目录名称中有引号和反斜杠,则仍需要像上面那样进行转义(但不转义空格)。

不管怎样,如果您的目录名称中有换行符,那么您遇到的麻烦就比我能帮助解决的要大。

编辑删除了 bash 版本,并根据 Dennis Williamson 的输入进行了清理

答案4

zsh不是我喜欢的 shell,但是对于这个任务它的 ** 功能是无敌的:

zsh -c "'ls **/'the file name'"

甚至:

zsh -c "ls **/*'file name'"

相关内容