2

此命令和输出:

% find . -name file.xml 2> /dev/null
./a/d/file.xml
%

所以这个命令和输出:

% dirname `find . -name file.xml 2> /dev/null`
./a/d
%

所以你会期望这个命令:

% cd `dirname `find . -name file.xml 2> /dev/null``

将当前目录更改为 ./a/d。奇怪的是,这不起作用。当我键入cd ./a/d. 目录更改有效。但是我不知道为什么上述方法不起作用......

4

4 回答 4

10

刚刚注意到反引号......改用这个:

cd $(dirname $(find . -name file.xml 2> /dev/null))

编辑:引用参数(如果它们包含空格):

cd "$(dirname "$(find . -name file.xml 2> /dev/null)")"
于 2010-03-15T18:47:30.867 回答
5

你也可以使用find's-execdir选项

   -execdir command {} +
          Like  -exec,  but  the  specified  command  is run from the subdirectory containing the matched file, ....

所以没有必要cd

于 2010-03-16T01:42:00.193 回答
2

使用@fortran 的答案中的'$(...)' 符号。如果您必须使用反引号,那么您必须转义嵌套的:

cd `dirname \`find . -name file.xml 2> /dev/null\``

例如,当您想要更改当前 Perl 版本的 lib 目录时,它会变得非常棘手。

简单的

cd $(dirname $(dirname $(which perl)))/lib

难的

cd `dirname \`dirname \\\`which perl\\\`\``/lib

这就是为什么 '$(...)' 表示法更可取的原因。

于 2010-03-16T02:09:25.727 回答
1

请注意,您可以使用以下反引号来编写此代码find -exec

cd `find . -name file.xml -exec dirname {} \;`

或者使用 GNU find 的-printf操作:

cd `find . -name file.xml -printf %h`
于 2010-03-15T19:06:02.197 回答