Como faço para encontrar seguir mais, mas não todos, links simbólicos?

10

Meu sistema operacional e meu diretório pessoal estão em um SSD. Eu armazeno alguns arquivos grandes em um disco rígido e um link simbólico do meu diretório home para o disco rígido (por exemplo, ~ / Videos / Films é um link simbólico para / mnt / hdd / Films). Eu também tenho um número de prefixos do Wine, cada um dos quais tem dosdevices / z: link simbólico para /.

Então, se eu usasse o find sem -L, ele perderia tudo o que está no disco rígido. Mas se eu usar find com -L, ele acaba em um loop devido ao link simbólico do Wine para /.

Existe alguma maneira sensata de resolver isso, para encontrar pesquisas onde eu quero? Intuitivamente, estou querendo algo do tipo "siga links simbólicos, a menos que estejam em um diretório chamado dosdispositivos". "Seguir links simbólicos para algo no disco rígido" também funcionaria.

    
por Mark Raymond 01.01.2014 / 00:06

4 respostas

10

O -prune primary informa ao find para não reciclar em um diretório.

find -L -path ~/.wine/dosdevices -prune -o -type f -name 'My Favorite Movie.*' -print

Se você quiser usar -lname em sua condição, não será possível usar a opção -L , porque -L faz com que a maioria dos predicados atue no destino do link, incluindo -lname . Minha recomendação nesse caso seria usar tanto o diretório inicial quanto a raiz do disco rígido como raízes da pesquisa.

find ~ /mnt/hdd -xtype f -name 'My Favorite Movie.*'

Você pode executar find ~ -type l … para reunir uma lista de links simbólicos e usá-los como raízes adicionais.

( IFS=$'\n'; set -f;
  find ~ $(find ~ -type l -lname '/mnt/hdd/*') \
       -xtype f -name 'My Favorite Movie.*' )

Se você realmente quiser recorrer a links simbólicos, poderá excluir links simbólicos específicos por destino, em vez de por nome. No entanto, você só pode excluir uma lista finita, não um padrão ou uma subárvore dessa maneira.

find -L \( -samefile /exclude/this -o -samefile ~/and/that \) -prune -o \
     -type f -name 'My Favorite Movie.*' -print

Você pode usar outros critérios, como ! -writable (arquivos para os quais você não tem permissão de gravação), mas não acho que o GNU find tenha uma maneira de recorrer a links simbólicos apenas se o texto de destino corresponder a um determinado expressão.

Você poderia criar um comando find que faz quase o que você deseja, exceto para não excluir links simbólicos suficientes, executar find2perl para converter a consulta em um script Perl e ajustar o script Perl um pouco. Existem muitos switches do GNU find que o find2perl não reconhece, no entanto.

    
por 01.01.2014 / 01:10
0

Quantos links simbólicos para os discos rígidos você tem? Se não for muito, uma solução é não usar "-L", especificando explicitamente os links simbólicos que você deseja seguir na linha de comando find. Algo como:

find .  ~/Videos/Films -name '*file I want*' ...

Isto irá procurar o diretório atual ("."), bem como o link simbólico "~ / Videos / Films", mas não irá descer para outros links simbólicos.

    
por 01.01.2014 / 00:13
0

Outra solução que resolve o problema (pelo menos no meu caso) é usar montagens de ligação em vez de links simbólicos para os diretórios no disco rígido. Isso é feito adicionando entradas em /etc/fstab da seguinte forma:

/mnt/hdd/Films /home/mark/Videos/Films none bind 0 0

    
por 04.10.2015 / 23:13
0

Para pesquisar em TODOS os links, isso funcionou para mim:

find -L . -name \*.txt
    
por 29.01.2016 / 16:08

Tags