2008-10-29 1 views
204

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

/home/ken/foo/bar 

, но, насколько я могу видеть, как ls и find только дают относительные пути ПРЕДЛОЖЕНИЙ

./foo/bar (from the folder ken) 

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

+0

use: find/home/ken/foo/bar -exec ls -ld $ PWD/{} \; – Learner 2013-12-05 04:57:01

ответ

213

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

find `pwd` -name .htaccess 

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

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

+8

Обратите внимание, что если вы также хотите разрешить символические ссылки, используйте `pwd -P`. – 2008-10-29 09:28:56

+3

Это полезно, но я думаю, что ответ user431529 ниже верен: `ls -d -1 $ PWD/**/*`, но я думаю, `find $ PWD` также работает (проверено в bash) – Brian 2011-04-27 16:47:00

+5

@Brian Why ? `find $ PWD` прост. Заклинание `ls` является сложным и громоздким (если вы его не называете). `find` не зависит от расширений оболочки glob, поэтому будет работать в любой оболочке. `find` также намного более гибкий, я могу получить рекурсивный список всех файлов или, возможно, всех каталогов, или, может быть, мне нужен список всех xml-файлов или все файлы, измененные на прошлой неделе. Все, что возможно с `find`, но не легко с` ls`. – 2011-07-08 07:31:39

-2

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

+1

... к сожалению, он будет делать что-то еще (например, отображать «некоторые» другие файлы, если не фильтруется) – DerMike 2012-04-12 09:00:41

18

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

find $PWD 

в Баш

4

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

находка/дома/кен/Foo/-name бар -print
(вместо относительного пути найти -name бар -print.)

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

/дома/кен/Foo/бар

Поэтому, если вы хотите Ls -l и он возвращает абсолютный путь, вы можете просто сказать команду поиска, чтобы выполнить Ls -l на что бы он ни нашел.

находка/дома/кен/Foo -name бар -exec Ls -l {}; \

Примечание: Существует пробел между {} и;

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

-rw-р - r-- 1 кен администратора 181 27 января 15:49/главная/кен/Foo/бар

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

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

(2> является синтаксисом для оболочек borne и bash, но не работает с c shell.Он может работать и в других оболочках, но я точно знаю, что он работает в bourne и bash).

Надеюсь, это поможет!

167
readlink -f filename 

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

2

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

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

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

find $PWD -type f 

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

Смежные вопросы