我正在尝试使用 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'"