Как я могу создать список файлов с их абсолютным путем в Linux?
-
05-07-2019 - |
Вопрос
Я пишу сценарий оболочки, который принимает пути к файлам в качестве входных данных.
По этой причине мне нужно создать рекурсивные списки файлов с полными путями. Например, файл 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}'