Почему использование dirname в команде находки дает точки для каждого соответствия?

Я использую, находят для задачи, и я заметил это, когда я делаю что-то вроде этого:

find `pwd` -name "file.ext" -exec echo $(dirname {}) \;

это даст Вам, отмечает точкой только для каждого соответствия. Когда Вы занимаете место dirname с basename в той команде Вы получаете полные пути. Я завинчиваю что-то здесь, или это - ожидаемое поведение? Я привык к basename давание Вам название файла (в этом случае file.ext) и dirname предоставление Вам остальная часть пути.

33
задан kenorb 1 November 2017 в 16:28
поделиться

5 ответов

Рассмотрим следующий сценарий:

#!/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 , расширение все равно происходит, но результаты расширения будут другими:

  1. pwd расширяется до текущего пути . В моем примере выше результат / home / kibab
  2. выполняется базовое имя {} . Результатом этой команды будет {} .
  3. Команда find выполняется с указанными выше заменами. Последняя выполненная команда выглядит так:

    find / home / kibab -name '* .png' -exec echo '{}' ';'

Проверив приведенную выше команду, вы заметите, что теперь команда просто выведите любой найденный файл.

Может быть, вы хотите что-то вроде этого?

find `pwd` -name "file.ext" -printf "%f\n"
28
ответ дан 27 November 2019 в 17:54
поделиться

$ (dirname {}) оценивается оболочкой перед передачей в find . Результатом этой оценки является . , значит, вы просто говорите find выполнить echo. для каждого найденного файла.

basename {} оценивается как {} , поэтому при замене $ (basename {}) на $ (dirname {}) , find выполнит echo {} для каждого файла. Это приводит к отображению полного имени каждого файла.

Если вы хотите вывести результат dirname для каждого найденного файла, вы можете опустить echo :

find `pwd` -name "file.ext" -exec dirname {} \;
6
ответ дан 27 November 2019 в 17:54
поделиться

вам не нужно вызывать dirname () для каждого найденного файла. с помощью GNU find вы можете использовать -printf и это быстрее

find /path -type f -iname "*.ext" -printf "%h\n"
8
ответ дан 27 November 2019 в 17:54
поделиться

Не знаю, почему вы это получаете, но попробуйте следующее:

find `pwd` -name file.ext |xargs -l1 dirname
5
ответ дан 27 November 2019 в 17:54
поделиться

Это потому, что find печатает пути относительно пути, по которому он ищет. Если вы попробуете выполнить этот поиск из / , вы получите «pwd \ для каждого пути.

0
ответ дан 27 November 2019 в 17:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: