Рекурсивный список всех файлов в каталоге, включая файлы в каталогах символических ссылок

147

Предположим , у меня есть каталог , /dirв котором есть 3 символические ссылки на другие каталоги /dir/dir11, /dir/dir12и /dir/dir13. Я хочу , чтобы получить список всех файлов в dirтом числе и в dir11, dir12и dir13.

Чтобы быть более общим, я хочу перечислить все файлы, включая файлы в каталогах, которые являются символическими ссылками. find .и ls -Rт. д. остановитесь на символической ссылке, не переходя к ним, чтобы получить дальнейший список.

CuriousDawg
источник
Возможный дубликат Как получить имя файла только с linux `find`?
Евгений Коньков

Ответы:

232

-LВариант lsбудет выполнять то , что вы хотите. Разыменовывает символические ссылки.

Итак, ваша команда будет:

ls -LR

Вы также можете сделать это с

find -follow

-followВариант направляет найти следовать символические ссылки на каталоги.

На Mac OS X используйте

find -L

как -followне рекомендуется.

Майкл Ридли
источник
14
-follow устарела в пользу -L в новых версиях find.
pjz
@pjz: есть ли перекрестная ссылка для '-flolow устарела; использовать -L '? К моему большому удивлению, я обнаружил, что '-L' и '-H' перечислены в стандарте POSIX / SUS на opengroup.org/onlinepubs/009695399/toc.htm , и, что еще больше, к моему удивлению, нет '-follow', поэтому я ответил на свой вопрос.
Джонатан Леффлер
это не сработало для меня. сначала ничего не случилось потом я попробовал -follow- и он сказал, что не может найти папкуollow
smatthewenglish
4
На OS X 10.10 это работает: find -L .- У меня была та же проблема, что и у @ S.Matthew_English
fregante
Ваш ответ хороший, но я хочу указать followтолько пути к файлам (полный путь к файлу), а не путь к каталогу, как я могу это сделать?
Вики Дев
116

Как насчет дерева ? tree -lбудет следовать символическим ссылкам.

Отказ от ответственности : я написал этот пакет.

Стив Бейкер
источник
2
Как насчет пакета арки?
Mr_and_Mrs_D
Это более интуитивный взгляд, чем ls. Его также легче наклеивать.
дхаупин
46
find /dir -type f -follow -print

-type f означает, что он будет отображать реальные файлы (не символические ссылки)

-follow означает, что он будет следовать символическим ссылкам вашего каталога

-print заставит его отображать имена файлов.

Если вы хотите отображение типа ls, вы можете сделать следующее

find /dir -type f -follow -print|xargs ls -l
Dvorak
источник
это производит более красивое отображение, чем ls -Lопция
eusoubrasileiro
10

Используя ls:

  ls -LR

от 'man ls':

   -L, --dereference
          when showing file information for a symbolic link, show informa‐
          tion  for  the file the link references rather than for the link
          itself

Или, используя find:

find -L .

Из справочной страницы поиска:

-L     Follow symbolic links.

Если вы обнаружите, что хотите переходить только по нескольким символическим ссылкам (например, по ссылкам, указанным выше), вам следует обратиться к опции -H, которая следует только за символическими ссылками, которые вы передаете ей в командной строке.

pjz
источник
5

Я знал, что treeэто уместно, но у меня не было дерева. Итак, я получил довольно близкую альтернативу здесь

find ./ | sed -e 's/[^-][^\/]*\//--/g;s/--/ |-/'
divinedragon
источник
Это было именно то, что мне было нужно. Спасибо.
Скотт С
5
find -L /var/www/ -type l

# man find
-L     Follow  symbolic links.  When find examines or prints information about files, the information used shall be taken from the

свойства файла, на который указывает ссылка, а не из самой ссылки (если это не битая символическая ссылка или поиск не может проверить файл, на который указывает ссылка). Использование этой опции подразумевает -noleaf. Если вы позже используете опцию -P, -noleaf все равно будет действовать. Если -L действует, и find обнаруживает символическую ссылку на подкаталог во время его поиска, будет выполняться поиск в подкаталоге, на который указывает символическая ссылка.

Эшвин Муни
источник
2
ls -R -L

-Lразыменовывает символические ссылки. Это также сделает невозможным увидеть какие-либо символические ссылки на файлы - они будут выглядеть как файлы, на которые указывают ссылки.

Бранан
источник
-1

если вы хотите распечатать все содержимое файла : find . -type f -exec cat {} +

qrtLs
источник