Базовое имя команды не работает в команде поиска - PullRequest
1 голос
/ 05 апреля 2020

Вывод:

find mydir -name foo -exec echo "---$(basename {})---" \;

должен быть --- foo --- , но вместо этого --- mydir / foo ---

Команда basename отдельно:

basename mydir/foo 
echo "---$(basename mydir/foo)---"

приносит соответствующие foo и --- foo ---

Замена basename другой командой, такой как uname , конструкция $ (...) работает правильно.

Ответы [ 2 ]

4 голосов
/ 05 апреля 2020

Поскольку $(basename {}) расширяется до {} на bash перед выполнением команды find, ваша команда find в точности эквивалентна:

find mydir -name foo -exec echo "---{}---" \;

Вот почему вы видите ---mydir/foo---

Чтобы получить желаемый эффект, вы можете сделать:

find mydir -name foo -exec bash -c 'echo "---$(basename {})---"' \;
0 голосов
/ 06 апреля 2020

В конце концов я нашел решение, создав сценарий, который вызывает себя из команды find:

#!/bin/bash
if [ $# -eq 0 ]; then
    find myDir -name foo -exec $(readlink -f $0) "{}" \;
else
    echo "---$(basename $1)---"
fi

Это не так элегантно, как однострочное решение (подсказка Филиппу), но при необходимости более расширяемое

...