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

10

Meu sistema operacional e diretório inicial estão em um SSD. Eu armazeno alguns arquivos grandes em um disco rígido e o link simbólico do meu diretório pessoal para o disco rígido (por exemplo, ~ / Videos / Films é um link simbólico para / mnt / hdd / Films). Eu também tenho vários prefixos de vinho, cada um dos quais com dosdevices / z: vinculado a /.

Então, se eu usei find sem -L, ele perderá tudo o que está no disco rígido. Mas se eu usar find com -L, ele termina 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 como "siga os links simbólicos, a menos que estejam sob um diretório chamado dosdevices". "Seguir links simbólicos que estão em algo no disco rígido" também funcionaria.

Mark Raymond
fonte

Respostas:

11

O -pruneprimário diz findpara não ser recursivo em um diretório.

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

Se você deseja usar -lnameem sua condição, não poderá usar a -Lopção, porque -Lfaz com que a maioria dos predicados atue no destino do link, inclusive -lname. Minha recomendação nesse caso seria usar o diretório inicial e a raiz do disco rígido como raízes da sua pesquisa.

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

Você pode correr 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 deseja se recuperar em links simbólicos, pode 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 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 se recuperar sob links simbólicos somente se o texto de destino corresponder a uma determinada expressão.

Você pode criar um findcomando que faça quase o que deseja, exceto não excluir links simbólicos suficientes, executar find2perl para converter a consulta em um script Perl e ajustar um pouco o script Perl. Existem muitas opções do GNU que descobrem que o find2perl não reconhece, no entanto.

Gilles 'SO- parar de ser mau'
fonte
Obrigado! -pruneé exatamente o tipo de coisa que eu estava procurando. Descobri que find ~ \( -lname ~ -o -lname ~/\* -o -lname / \) -xtype dlista todos os links simbólicos que não quero seguir; Agora estou tentando encontrar uma maneira de usar essa consulta para podar.
Mark Raymond
@MarkRaymond O princípio geral é find ~ <negative criteria> -prune -o <positive criteria> -print, entãofind ~ \( -lname ~ -o -lname ~/\* -o -lname / \) -xtype d -prune -o <whatever it is you want> -print
Gilles 'SO- stop be evil' '
@ Giles - que funciona bem sem -L, mas depois que adiciono -L, as expressões -lname não funcionam mais (como a página de manual diz que não). Então, basicamente, preciso de algumas condições para seguir links simbólicos e outras para não!
Mark Raymond
Não consigo pensar em uma maneira de fazer exatamente o que você quer com a busca. Veja minha edição para algumas aproximações.
Gilles 'SO- stop be evil' em
1

Para pesquisar TODOS os links, funcionou para mim:

find -L . -name \*.txt
jim
fonte
0

Quantos links simbólicos para discos rígidos você possui? Se não houver muitas soluções, não use "-L" enquanto especifica explicitamente os links simbólicos que você deseja seguir na linha de comando find. Algo como:

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

Isso pesquisará o diretório atual ("."), Bem como o link simbólico "~ / Videos / Films", mas não descerá para outros links simbólicos.

John1024
fonte
0

Outra solução que contorna 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 da /etc/fstabseguinte maneira:

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

Mark Raymond
fonte