Ignora diretórios sob uma certa raiz enquanto segue links simbólicos com find

1

Estou coletando todos os arquivos em um diretório. Mas este diretório tem links simbólicos para outro diretório fora do diretório onde eu estou executando o comando find e contém um grande número de arquivos, bem como diretórios. Embora eu possa ignorar esse diretório com a ajuda da remoção, o problema surge quando um link simbólico aponta para um diretório filho desse diretório enorme. Eu quero ignorar todos os links simbólicos que apontam para qualquer um dos diretórios filhos.

Aqui está um exemplo de comando find -L /usr/local/searchdir

Poucos links simbólicos

/usr/local/searchdir/d0/link --> /small/dir  
/usr/local/searchdir/d1/file.o  
/usr/local/searchdir/d2/link --> /little/dir  
/usr/local/searchdir/d3/link --> /hugedir  
/usr/local/searchdir/d4/link --> /hugedir/main  
.  
.  
.  
/usr/local/searchdir/dx      --> /hugedir/c4  

Diretórios problemáticos

/hugedir/c1/tmp  
/hugedir/c2/main  
/hugedir/c3/dir  
/hugedir/c4/ext  
/hugedir/c5/client  
/hugedir/c6/bin  
/hugedir/c7/std
    
por Rakesh 15.09.2016 / 10:37

2 respostas

1

O GNU find tem uma opção -lname para corresponder ao destino de um symlink, mas não pode ser usado com -L / -follow .

Supondo que você queira usar -L , precisará chamar -exec para implementar sua própria verificação de que o link está nesse diretório grande.

Usando o find do -xtype do GNU como uma otimização, supondo que seu sistema tenha um readlink e que ele ofereça suporte à opção -f a GNU readlink :

find -L . -type d -xtype l -exec sh -c '
  case $(readlink -f "$1") in
    (/hugedir | /hugedir/*) exit 0;;
    (*) exit 1;;
  esac' sh {} \; -prune -o ...

Ou um pouco mais eficiente.

find -L . -type d -xtype l -exec sh -c '
  cd -P "$1" && case $PWD in
    (/hugedir | /hugedir/*) exit 0;;
    (*) exit 1;;
  esac' sh {} \; -prune -o ...
    
por 15.09.2016 / 18:48
0

O comando find por padrão ignora os links simbólicos. Você pode, de qualquer maneira, especificar explicitamente esse comportamento por meio do sinal -P :

   -P     Never follow symbolic links.  This is the default behaviour.  When find examines or prints information a file, and the file is a symbolic link, the information used shall be  taken  from  the
          properties of the symbolic link itself.

   -L     Follow  symbolic  links.  When find examines or prints information about files, the information used shall be taken from the properties of the file to which the link points, not from the link
          itself (unless it is a broken symbolic link or find is unable to examine the file to which the link points).  Use of this option implies -noleaf.  If you later use the -P option, -noleaf will
          still be in effect.  If -L is in effect and find discovers a symbolic link to a subdirectory during its search, the subdirectory pointed to by the symbolic link will be searched.

          When  the  -L  option  is in effect, the -type predicate will always match against the type of the file that a symbolic link points to rather than the link itself (unless the symbolic link is
          broken).  Using -L causes the -lname and -ilname predicates always to return false.

   -H     Do not follow symbolic links, except while processing the command line arguments.  When find examines or prints information about files, the information used shall be taken from  the  proper‐
          ties  of  the  symbolic link itself.   The only exception to this behaviour is when a file specified on the command line is a symbolic link, and the link can be resolved.  For that situation,
          the information used is taken from whatever the link points to (that is, the link is followed).  The information about the link itself is used as a fallback if the file pointed to by the sym‐
          bolic  link  cannot  be  examined.   If  -H  is in effect and one of the paths specified on the command line is a symbolic link to a directory, the contents of that directory will be examined
          (though of course -maxdepth 0 would prevent this).
    
por 15.09.2016 / 10:49