Как избежать множества уровней символических ссылок с помощью этой находки?

попробуйте следующее:

cd /usr/share/metasploit-framework/ ; bundle install
3
13.04.2017, 15:36
3 ответа

Если вы хотите отобразить все файлы в $ HOME , включая те, на которые есть ссылки через символические ссылки, которые заканчиваются на .tex и содержат строку janne :

find -L "$HOME" -type f -name '*.tex' -exec grep -l 'janne' {} + 2>/dev/null | vim -R -

Если вы хотите отображать только символические ссылки, найденные в $ HOME с именем *. Tex , соответствующие файлам, которые содержать строку janne :

find -L "$HOME" -xtype l -name '*.tex' -exec grep -l 'janne' {} + 2>/dev/null | vim -R -

Единственный способ избежать сообщения об ошибке «Слишком много уровней символических ссылок» - это отбросить все ошибки, что я сделал с помощью 2> / dev / null конструкция.

В обоих случаях команда find не будет перемещаться по файлам и каталогам, которые она уже прошла - она ​​запоминает, где она уже была посещена, и автоматически удаляет эти части дерева файловой системы. Например,

mkdir a a/b a/b/c
cd a/b/c
ln -s ../../../a

# Here you can ls a/b/c/a/b/c/a/b/...

# But find will not continue for very long
find -L a
a
a/b
a/b/c
find: File system loop detected; ‘a/b/c/a’ is part of the same file system loop as ‘a’.
1
27.01.2020, 21:22

Ваша проблема в том, что у вас есть рекурсивные символические ссылки.Я бы рассмотрел два варианта:

  • забыть о -L , получить все файлы с именем .tex в любом месте дерева, а затем отфильтровать их (нет ли других критериев, кроме нахождения в каталоге, на которую указывает символическая ссылка, которая начинается с «Math»?)

  • Сделайте это в два этапа, оба без -L : сначала вы ищите все символические ссылки с именем «Math *» (и, может быть, каталоги тоже? ). Вы берете этот список и рекурсивно ищите оттуда свои tex-файлы, например:

     find. -тип l -имя "Math *" -print0 \ 
     | xargs -0 grep -Hr --include "* .tex" "janne" 
     
1
27.01.2020, 21:22

Если вы используете -L , потому что $ HOME является символической ссылкой, и вы все равно хотите, чтобы find спустился в нее (но не в другую символическую ссылку на каталоги, которая может вызвать проблему, с которой вы столкнулись), затем используйте:

find "$HOME/" -name '*.tex' -type f -exec fgrep -l janne {} +

( / dev / null не требуется с -l ).

Или:

find -H "$HOME" -name '*.tex' -type f -exec fgrep -l janne {} +

Это просматривает только обычные файлы, как обычно, вы не хотите заглядывать внутрь FIFO, устройств или каталогов. Чтобы также заглядывать внутрь символических ссылок на обычные файлы (но тогда вы, вероятно, просматриваете один и тот же файл несколько раз), вы можете изменить -тип f на -xtype f (при условии GNU найти ).

1
27.01.2020, 21:22

Теги

Похожие вопросы