Bash: использование команд в качестве параметров (в частности, cd, dirname и find) - PullRequest
2 голосов
/ 15 марта 2010

Эта команда и вывод:

% 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 ]

10 голосов
/ 15 марта 2010

Только что заметил галочки ... используйте вместо этого:

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

edit : с указанными аргументами (если они содержат пробелы):

cd "$(dirname "$(find . -name file.xml 2> /dev/null)")"
4 голосов
/ 16 марта 2010

Вы также можете использовать find -execdir вариант

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

так что нет необходимости cd

2 голосов
/ 16 марта 2010

Используйте обозначение '$ (...)', как в ответе @ fortran.Если вы должны использовать обратные галочки, то вам нужно избегать вложенных:

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

Это становится действительно опасно, когда вы хотите перейти в каталог lib для вашей текущей версии Perl, например.

Легко

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

Сложно

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

Вот почему нотация '$ (...)' предпочтительнее.

1 голос
/ 15 марта 2010

Обратите внимание, что вы можете написать это с одним меньшим количеством обратных кавычек, используя find -exec:

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

Или, альтернативно, используя GNU find -printf action:

cd `find . -name file.xml -printf %h`
...