Existe uma maneira de definir links simbólicos apenas para arquivos executáveis no Linux?

3

Eu tenho um diretório com arquivos de código e arquivos executáveis e eu quero saber como criar um link simbólico apenas para arquivos executáveis nesse diretório?

Eu sei que path-of-directory/* seleciona todos os arquivos, mas eu quero apenas os executáveis.

    
por tony_pt 29.03.2015 / 18:37

3 respostas

6

Você pode usar find para listar arquivos executáveis:

find /foo -type f -executable 

Você pode então usar a opção -exec para criar o link.

   -exec command ;
          Execute  command;  true  if 0 status is returned.  All following
          arguments to find are taken to be arguments to the command until
          an  argument  consisting of ';' is encountered.  The string '{}'
          is replaced by the current file name being processed  everywhere
          it occurs in the arguments to the command [...]

Então, para criar um link em ~/bar para cada arquivo executável em ~/foo , você faria

find ~/foo -type f -executable -exec ln -s {} ~/bar \;

Observe que isso não está procurando por arquivos binários, simplesmente para aqueles que têm o bit executável definido.

    
por 29.03.2015 / 18:51
4

Outra possibilidade:

for i in ~/foo/*; do [ -x "$i" ] && ln -s "$i" ~/bar; done

-x testa se o arquivo existe e é executável. Veja man test para mais informações.

Se você deseja criar links relativos funcionais, talvez seja necessário pensar em como fornecer os caminhos de diretório ou usar a opção -r para ln (que é uma extensão GNU um pouco nova (≥8.16), mas deve estar presente em todas as distribuições "recentes".

Se você quiser percorrer subdiretórios usando esse método, ative globstar com shopt -s globstar e forneça o caminho de pesquisa como ~/foo/** (consulte globstar no manual do Bash).

O teste [ -x ] incluirá diretórios com o conjunto de bits executável, que pode não ser desejado. Se houver algum problema, um teste [ -f ] extra para ver se a correspondência é um arquivo pode ser adicionado.

    
por 29.03.2015 / 19:14
1

Se você usa zsh (e eu recomendo tentar isso com mágica), você pode simplesmente usar um qualificador glob .

ln -s /path/to/foo/*(*) /path/to/bar

(*) significa apenas arquivos executáveis; você pode usar construções semelhantes para arquivos, diretórios, links, etc. ou operações de classificação e manipulação ainda mais avançadas.

    
por 30.03.2015 / 00:56