Как я могу создать список файлов с их абсолютным путем в Linux?

StackOverflow https://stackoverflow.com/questions/246215

Вопрос

Я пишу сценарий оболочки, который принимает пути к файлам в качестве входных данных.

По этой причине мне нужно создать рекурсивные списки файлов с полными путями. Например, файл bar имеет путь:

/home/ken/foo/bar

но, насколько я вижу, и ls , и find дают только списки относительных путей:

./foo/bar   (from the folder ken)

Это кажется очевидным требованием, но я не вижу ничего в справочных страницах find или ls .

Как я могу создать список файлов в оболочке, включая их абсолютные пути?

Это было полезно?

Решение

Если вы дадите find абсолютный путь для начала, он выведет абсолютные пути. Например, чтобы найти все файлы .htaccess в текущем каталоге:

find "$(pwd)" -name .htaccess

или если ваша оболочка развернет $ PWD в текущий каталог:

find "$PWD" -name .htaccess

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

Грег Хьюгилл также предложил использовать pwd -P , если вы хотите разрешить символические ссылки в вашем текущем каталоге.

Другие советы

readlink -f filename 

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

Используйте это для dirs ( / после ** требуется в bash, чтобы ограничить его каталогами):

ls -d -1 "$PWD/"**/

это для файлов и каталогов непосредственно в текущем каталоге, имена которых содержат . :

ls -d -1 "$PWD/"*.*

это для всего:

ls -d -1 "$PWD/"**/*

взяты отсюда    http://www.zsh.org/mla/users/2002/msg00033.html

В bash ** является рекурсивным, если вы включите shopt -s globstar .

Вы можете использовать

find $PWD 

в bash

ls -d "$PWD/"*

Это выглядит только в текущем каталоге. Он цитирует "$ PWD" если он содержит пробелы.

$ PWD - хороший вариант, предложенный Мэтью выше. Если вы хотите, чтобы find печатал только файлы, вы также можете добавить опцию -type f для поиска только обычных файлов. Другими вариантами являются " d " только для каталогов и т. д. Так что в вашем случае (если я хочу искать только файлы с расширением .c ext):

find $PWD -type f -name "*.c" 

или если вам нужны все файлы:

find $PWD -type f

Примечание. Вы не можете создать псевдоним для вышеуказанной команды, потому что $ PWD автоматически заполняется в вашем домашнем каталоге, когда псевдоним устанавливается bash.

Если вы дадите команде find абсолютный путь, она выдаст результаты с абсолютным путем. Итак, из каталога Кена, если вы наберете:

find /home/ken/foo/ -name bar -print    

(вместо относительного пути find. -name bar -print )

Вы должны получить:

/home/ken/foo/bar

Следовательно, если вам нужен ls -l и он возвращает абсолютный путь, вы можете просто указать команде find выполнить ls -l для любого объекта. находит.

find /home/ken/foo -name bar -exec ls -l {} ;\ 

ПРИМЕЧАНИЕ. Между {} и существует пробел;

Вы получите что-то вроде этого:

-rw-r--r--   1 ken admin       181 Jan 27 15:49 /home/ken/foo/bar

Если вы не уверены, где находится файл, вы всегда можете изменить место поиска. Пока путь поиска начинается с " / " ;, вы получите в ответ абсолютный путь. Если вы ищете место (например, /), в котором вы получите много ошибок, связанных с отказом в разрешении, я бы порекомендовал перенаправить стандартную ошибку, чтобы вы могли увидеть результаты поиска:

find / -name bar -exec ls -l {} ;\ 2> /dev/null

( 2 > - это синтаксис для оболочек Borne и Bash, но он не будет работать с оболочкой C. Он может работать и в других оболочках, но я точно знаю, что он работает в Борн и Баш).

Команда: ls -1 -d " $ PWD / " *

Это даст абсолютные пути к файлу, как показано ниже.

[root@kubenode1 ssl]# ls -1 -d "$PWD/"*
/etc/kubernetes/folder/file-test-config.txt
/etc/kubernetes/folder/file-test.txt
/etc/kubernetes/folder/file-client.txt
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }

Вот пример, который распечатывает список без дополнительного периода, а также демонстрирует, как искать совпадение файла. Надеюсь, это поможет:

find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"

find / -print сделает это

ls -1 | awk  -vpath=$PWD/ '{print path$1}'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top