Encontre todos os arquivos de link que ligam a um diretório específico use o comando pure find

0

Eu tenho dois diretórios de links em ~, ~ / PathA (um diretório git) e ~ / PathB. O ~ / PathA é um subdiretório de ~ / PathB. Esses dois estão ligados a outro disco físico. Eu vinculei muitos arquivos ao arquivo em ~ / PathA / config / in my ~. Quero descobrir todos esses arquivos de link. mostre o formato "xxxxx - > yyyyy".

Esse método é usado com frequência quando usamos arquivos de configuração de outras máquinas antigas.

Se eu escrevo um script ou uso pipe, é fácil fazer, mas é algo feio. Mas eu quero se usar apenas o comando find eu posso fazer isso.

Editar: Depois de testar muitas vezes, eu entendi. O lugar mais importante é -lname e -print .

▶ find ~ -type l ! -path '/home/eexpss/磁盘' ! -path '/home/eexpss/bin' -lname '/home/eexpss/bin/config/*' -printf "%p -> %l\n"
/home/eexpss/.local/share/applications -> /home/eexpss/bin/config/.local+share+applications
/home/eexpss/.local/share/nautilus/scripts -> /home/eexpss/bin/config/.local+share+nautilus+scripts
/home/eexpss/.vimrc -> /home/eexpss/bin/config/fedora.vimrc
/home/eexpss/.proxy.pac -> /home/eexpss/bin/config/.proxy.pac
/home/eexpss/.bash_aliases -> /home/eexpss/bin/config/fedora.bash_aliases
/home/eexpss/.icons -> /home/eexpss/bin/config/.icons/
find: ‘/home/eexpss/磁盘/lost+found’: Permission denied
find: ‘/home/eexpss/磁盘/eexp/.gvfs’: Permission denied
/home/eexpss/.vim -> /home/eexpss/bin/config/.vim
/home/eexpss/.gitconfig -> /home/eexpss/bin/config/.gitconfig

Eu vou aceitar a resposta de Stéphane Chazelas. obrigado.

    
por utopic eexpress 27.03.2017 / 11:11

1 resposta

2

O padrão find não pode imprimir nenhuma informação sobre os arquivos encontrados por si mesmos, exceto os caminhos completos. No entanto, algumas implementações de find têm extensões para isso.

Por exemplo, com o GNU find (como encontrado na maioria das distribuições GNU / Linux genéricas / tradicionais):

find ~ -type l -printf '%p -> %l\n'

Irá imprimir os links simbólicos no formato que você está pedindo, para os links simbólicos encontrados recursivamente (fazendo uma travessia física , que não segue os links simbólicos para os diretórios) em seu diretório pessoal. Algumas implementações find também têm um predicado -ls para produzir em um formato semelhante a ls -li , do qual você pode extrair as informações.

Se você quisesse fazer uma travessia lógica (seguir links simbólicos para diretórios) e imprimir essa informação, você não poderia fazer isso com uma única invocação find (mesmo com GNU find ) , mas você pode usar o globbing de zsh para percorrer os diretórios e usar o GNU find apenas para imprimir as informações:

find ~/***/*(D@) -printf '%p -> %l\n'

Ou com qualquer shell e GNU find (mas várias invocações):

find -L ~ -xtype l -exec sh -c '
  exec find "$@" -printf "%p -> %l\n"' sh {} +

Para encontrar os links simbólicos que eventualmente apontam para algum arquivo existente em ~/bin/config (assumindo que nenhum dos componentes de ~/bin/config são links próprios), ainda com zsh :

find ~/**/*(D@e{'[[ $REPLY:A = ~/bin/config/* ]]'}) -printf '%p -> %l\n'
    
por 27.03.2017 / 12:35

Tags