Получить абсолютный путь к файлам с помощью команды «найти»

26

Есть ли способ получить абсолютный путь к файлу, который ищется?

Например:

find .. -name "filename"

Это дает мне результаты, как, ../filenameно я хочу полный путь.

Что мне нужно, это найти в родительском каталоге и его дочерних элементах определенный файл, который я буду использовать в другом сценарии позже.

Благодарность

JorgeeFG
источник

Ответы:

15

Попробуйте что-то вроде:

find "$(cd ..; pwd)" -name "filename"
Scrutinizer
источник
Спасибо, я просто тестировал $(cd ..; pwd). Здесь все работает хорошо, но если я делаю это один в терминале, я не могу получить родительский каталог ... Я получаю "Bash: <каталог>: каталог. И если $(cd ..; echo "something")я получаю, я получаю" что-то: не команда "
JorgeeFG
Вы имеете в виду как отдельную команду? Тогда вам нужно будет пропустить знак доллара:(cd ..; pwd)
Scrutinizer
Спасибо, вот и все. Любая ссылка, почему я должен удалить $, как это влияет на подоболочку?
JorgeeFG
1
Да ( ... )означает выполнение в подоболочке, вывод записывается в стандартный вывод. $( ... )расшифровывается как «подстановка команд». Последний может быть использован, как если бы это было расширение переменной.
Scrutinizer
find / -name "filename"
Panther
12

Попробуйте использовать -execопцию find:

find .. -name "filename" -exec readlink -f {} \;

Примечание: readlinkпечатает значение символической ссылки или канонического имени файла.

Сильвен Пино
источник
это вызовет readlink для каждого файла, поэтому он будет очень неэффективным.
bac0n
9

Вы можете использовать bashTilde Expansion, чтобы получить абсолютный путь к текущему рабочему каталогу, таким образом, также findпечатается абсолютный путь для результатов:

find ~+ -type f -name "filename"

Если выполняется в ~/Desktop, это расширяется до

find /home/yourusername/Desktop -type f -name "filename"

и печатает результаты как:

/home/yourusername/Desktop/filename

Если вы хотите использовать этот подход с родительским каталогом текущего рабочего каталога, вам нужно cdперед вызовом find:

cd .. && find ~+ -type f -name "filename"
Десерт
источник
7

Самый простой способ

find "$(pwd -P)" -name "filename"
Вивек
источник
Да! Илиfind `pwd -P` -name "filename"
Аполлис поддерживает Монику
это найдет файлы в текущем каталоге не от родителя.
bac0n
1

Также использование PWD может показать вам полный каталог. Pwd покажет вам все ваши каталоги, в которых вы находитесь, как расширение имени файла. Надеюсь, это помогло.

Sir_Dippingsauce
источник
1

Это сработало для меня, но вернет только первое вхождение.

realpath $(find . -type f -name filename -print -quit)

Чтобы получить полные пути для всех случаев (как предложил Сергей Колодяжный)

find . -type f -name filename | xargs realpath
Wyrmwood
источник
Предыдущий комментарий удален, +1, хорошая работа @Wyrmwood
Сергей Колодяжный
1

Удаление последнего компонента каталога с параметром Расширение .

find "${PWD%/*}" -name 'filename'

Пример того, как вы можете использовать mapfile для сохранения результатов поиска в индексированном массиве для последующего использования.

mapfile -t -d '' < <(find ${PWD%/*} -name 'filename' -print0)

(если имя массива не указано, MAPFILE будет именем массива по умолчанию).

for i in "${MAPFILE[@]}"; do
    echo "$((n++)) $i"
done
bac0n
источник