Как я могу создать список файлов с их абсолютным путем в Linux? - PullRequest
241 голосов
/ 29 октября 2008

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

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

/home/ken/foo/bar

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

./foo/bar   (from the folder ken)

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

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

Ответы [ 12 ]

245 голосов
/ 29 октября 2008

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

find "$(pwd)" -name .htaccess

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

find "$PWD" -name .htaccess

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

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

178 голосов
/ 02 января 2011
readlink -f filename 

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

101 голосов
/ 26 августа 2010

Используйте это для 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.

24 голосов
/ 29 октября 2008

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

find $PWD 

в баш

13 голосов
/ 15 сентября 2009
ls -d "$PWD/"*

Это выглядит только в каталоге current . Он заключает в кавычки "$ PWD", если он содержит пробелы.

5 голосов
/ 09 августа 2011

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

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

или, если вы хотите, чтобы все файлы:

find $PWD -type f

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

4 голосов
/ 29 января 2010

Если вы дадите команде 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. Она может работать и в других оболочках, но я точно знаю, что она работает в Bourne и Bash).

2 голосов
/ 20 марта 2019

Команда: 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
1 голос
/ 04 марта 2019

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

find . -type f -name "extr*" -exec echo `pwd`/{} \; | sed "s|\./||"
1 голос
/ 31 марта 2011
lspwd() { for i in $@; do ls -d -1 $PWD/$i; done }
...