Como evitar muitos níveis de links simbólicos com este achado?

3

Eu conheço o tópico e tento corrigir meu achado com -mindepth 15 sem sucesso

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

Tentativa malsucedida

find -L $HOME -type f -mindepth 15 -name "*.tex" \
   -exec fgrep -l "janne" /dev/null {} + | vim -R -

Seu STOUT

Vim: Reading from stdin...
find: ‘/home/masi/LOREM’: Too many levels of symbolic links

Visualização de links simbólicos sem sucesso que fornece todos os arquivos enquanto eu gostaria de ver apenas diretórios e arquivos com links simbólicos no sistema

tree -l

Proposta do Law29

# include symlinks
find "$1" -type l -name "$2*" -print0 \
    | xargs -0 grep -Hr --include "*.tex" "$2" /dev/null {} + | vim -R -

Resultado malsucedido, mas não deve estar vazio

Vim: Reading from stdin...
grep: {}: No such file or directory
grep: +: No such file or directory

Características do sistema

masi@masi:~$ ls -ld -- "$HOME" /home/masi/LOREM 
drwxr-xr-x 52 masi masi 4096 Aug 16 16:09 /home/masi
lrwxrwxrwx  1 masi masi   17 Jun 20 00:27 /home/masi/LOREM -> /home/masi/LOREM/

masi@masi:~$ type find
find is /usr/bin/find

masi@masi:~$ find --version
find (GNU findutils) 4.7.0-git
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=2) 

Sistema: Linux Ubuntu 16.04 64 bit
Para o script no tópico: aqui
Localizar: 4.7.0
Grep: 2,25
Aplicação de find : haetex aqui

    
por Léo Léopold Hertz 준영 08.07.2016 / 16:07

3 respostas

1

Se você deseja exibir todos os arquivos em $HOME , incluindo aqueles referenciados por links simbólicos, que terminam com .tex e contêm a string janne :

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

Se você deseja exibir somente os links simbólicos encontrados em $HOME denominado *.tex correspondente aos arquivos que contêm a string janne :

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

A única maneira de evitar a mensagem de erro "Muitos níveis de links simbólicos" é descartar todos os erros, o que fiz com a construção 2>/dev/null .

Em ambos os casos, o verbo find não atravessará os arquivos e diretórios que ele já percorreu - ele lembra onde já foi visitado e remove automaticamente essas partes da árvore do sistema de arquivos. Por exemplo,

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’.
    
por 17.08.2016 / 20:06
1

Seu problema é que você tem links simbólicos recursivos. Eu consideraria duas opções:

  • esqueça o -L , obtenha todos os arquivos com o nome .tex em qualquer lugar da árvore e depois os filtre (não há outro critério além de estar em um diretório apontado por um link simbólico que começa com "Matemática"?)

  • Faça isso em duas etapas, ambas sem -L : primeiro você procura por todos os links simbólicos chamados "Math *" (e talvez diretórios também?). Você pega essa lista e procura seus arquivos tex de forma recursiva a partir daí, assim:

    find . -type l -name "Math*" -print0 \    
        | xargs -0 grep -Hr --include "*.tex" "janne"
    
por 08.07.2016 / 23:57
1

Se o motivo que você está usando -L é porque $HOME é um symlink e você ainda quer que find entre nele (mas não no outro symlink para diretórios que causaria o problema que você está executando em), então use:

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

( /dev/null não é necessário com -l ).

Ou:

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

Isso parece dentro de arquivos regulares apenas como geralmente, você não quer olhar dentro de fifos, dispositivos ou diretórios. Para também olhar dentro de links simbólicos para arquivos regulares (mas você provavelmente estaria olhando para o mesmo arquivo várias vezes), você pode alterar o -type f para -xtype f (assumindo o GNU find ).

    
por 16.08.2016 / 13:04

Tags