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))

edit : 引用符で囲まれた引数 (空白が含まれている場合):

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

find-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

を使用して、バッククォートのレベルを 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 に答える