Я использую, находят для задачи, и я заметил это, когда я делаю что-то вроде этого:
find `pwd` -name "file.ext" -exec echo $(dirname {}) \;
это даст Вам, отмечает точкой только для каждого соответствия. Когда Вы занимаете место dirname
с basename
в той команде Вы получаете полные пути. Я завинчиваю что-то здесь, или это - ожидаемое поведение? Я привык к basename
давание Вам название файла (в этом случае file.ext
) и dirname
предоставление Вам остальная часть пути.
Рассмотрим следующий сценарий:
#!/bin/sh
set -x
find `pwd` -name "file.ext" -exec echo $(dirname {}) \;
set -x
показывает, как работает расширение и какова последняя команда. При запуске он дает следующий результат:
++ pwd
++ dirname '{}'
+ find /home/kibab -name file.ext -exec echo . ';'
Итак, первое, что раскрывается, - это pwd
. Второй - $ (dirname {})
. Результат этих двух команд затем помещается в команду поиска. Таким образом, вы передаете команду find -exec echo.
, поэтому вы видите ожидаемый результат.
Когда вы подставляете basename
вместо dirname
, расширение все равно происходит, но результаты расширения будут другими:
pwd
расширяется до текущего пути . В моем примере выше результат / home / kibab
выполняется базовое имя {}
. Результатом этой команды будет {}
. Команда find выполняется с указанными выше заменами. Последняя выполненная команда выглядит так:
find / home / kibab -name '* .png' -exec echo '{}' ';'
Проверив приведенную выше команду, вы заметите, что теперь команда просто выведите любой найденный файл.
Может быть, вы хотите что-то вроде этого?
find `pwd` -name "file.ext" -printf "%f\n"
$ (dirname {})
оценивается оболочкой перед передачей в find
. Результатом этой оценки является .
, значит, вы просто говорите find
выполнить echo.
для каждого найденного файла.
basename {}
оценивается как {}
, поэтому при замене $ (basename {})
на $ (dirname {})
, find
выполнит echo {}
для каждого файла. Это приводит к отображению полного имени каждого файла.
Если вы хотите вывести результат dirname
для каждого найденного файла, вы можете опустить echo
:
find `pwd` -name "file.ext" -exec dirname {} \;
вам не нужно вызывать dirname () для каждого найденного файла. с помощью GNU find вы можете использовать -printf
и это быстрее
find /path -type f -iname "*.ext" -printf "%h\n"
Не знаю, почему вы это получаете, но попробуйте следующее:
find `pwd` -name file.ext |xargs -l1 dirname
Это потому, что find
печатает пути относительно пути, по которому он ищет. Если вы попробуете выполнить этот поиск из /
, вы получите «pwd \
для каждого пути.