Por exemplo, quero encontrar todos os links simbólicos que fazem referência a um binário específico em todos os diretórios que pertencem ao sistema $ PATH. Isto pode ser alcançado com sucesso com a especificação manual de todos os diretórios:
sudo find ~/bin /home/samokat/.local/bin /home/samokat/bin /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /snap/bin -lname /opt/openoffice4/program/soffice
Mas quando estou tentando usar o comando com a expansão $PATH:
sudo find `echo $PATH | tr ':' ' '` -lname /opt/openoffice4/program/soffice
Recebo erro e resultado:
find: ‘~/bin’: No such file or directory
/usr/bin/soffice.link-to-openoffice-bak
echo $PATH | tr ':' ' '
gera o caminho correto:
~/bin /home/samokat/.local/bin /home/samokat/bin /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /snap/bin
Os seguintes também não estão funcionando:
sudo find `echo $PATH | tr ':' ' ' | xargs` -lname /opt/openoffice4/program/soffice
sudo find { `echo $PATH | tr ':' ' ' | xargs` } -lname /opt/openoffice4/program/soffice
sudo find eval "echo $PATH | tr ':' ' ' | xargs" -lname /opt/openoffice4/program/soffice
echo $PATH | tr ':' ' ' | xargs | sudo find -lname /opt/openoffice4/program/soffice # runs some long computation
Como passar starting point
diretórios como parâmetro calculável para find
? Isso é possível?
Não há necessidade de usar
sudo
, pois ele$PATH
deve conter diretórios que você já possa acessar.O
~
caractere é um atalho integrado para o diretório inicialbash
e outros shells. Mas não é avaliado tarde o suficiente para você usá-lo em seus exemplos. (Também não é avaliado em expressões entre aspas.)Quando você estiver configurando seu
$PATH
, em vez de usar algo comoPATH=~/bin:$PATH
, considere usar a alternativa mais explícitaPATH="$HOME/bin:$PATH"
.E para alguns códigos, aqui está uma solução alternativa que pode lidar com espaços em
$PATH
nomes de diretórios:Mais legível,
Seu
$PATH
contém~/bin
literalmente, portanto, ele só encontrará executáveis em umbin
subdiretório de um diretório chamado~
literalmente no diretório de trabalho atual, como depois de você executarmkdir -p '~/bin'
.Isso
~/bin
é falso e deve ser removido.Se você executar:
Onde isso
~
não for citado, você encontrará asprintf '%s\n' "$PATH"
saídas:Isso
~/bin
terá sido expandido corretamente para obin
seu diretório inicial, seguido pelo falso~/bin
que já estava lá e o restante do seu arquivoPATH
.Mas supondo
you
que seja realmentesamokat
, isso significa que o diretório ocorrerá duas vezes em$PATH
uma das quais é redundante.Depois de corrigir seu
$PATH
, parafind
arquivos em todos os componentes do diretório$PATH
, tudo que você precisa embash
os
funciona, mas é muito melhor definir
$IFS
parâmetros especiais determinam como as expansões de parâmetros sem aspas serão divididas. Por padrão,$IFS
contém o caractere de espaço (bem como nova linha e tabulação) que explica por que alterar:
s paraIFS
com o valor correto. Observe tambémset -o noglob
para desabilitar o outro efeito colateral de deixar uma expansão de parâmetro sem aspas.Observe também o
-H
sem qualfind
não procuraria em um diretório que na verdade é um link simbólico para um diretório.Ou se você puder mudar para
zsh
onde$PATH
está vinculado ao$path
array (como incsh
), então é apenas:Em
zsh
, você também pode usar globs em vez defind
.Por exemplo:
mostraria os caminhos dos links simbólicos ( ) dentro de cada
print
r
componente cujo valor real é .1
C
@
$path
P
/opt/openoffice4/program/soffice