Use encontrar resultado sem ./

Use encontrar resultado sem ./

Estou tentando usar find para criar vários links simbólicos, mas usar o resultado com {} inclui ./ antes de cada nome de arquivo. Como posso evitar isso?

find . -type l -name '*.h' -exec ln -s /sourcedir/{} /destinationdir/{} \;

Responder1

Você só precisa alterar um caractere em seu comando:

find * -type l -name '*.h' -exec ln -s /sourcedir/{} /destinationdir/{} \;
#    ^

Responder2

Use a sintaxe padrão, como:

S=/sourcedir D=/destdir find . -type l -name '*.h' -exec sh -c '
  for i do
    ln -s -- "$S${i#.}" "$D/$i"
  done' sh {} +

Se você quiser usar GNUisms, você poderia fazer:

find . -type l -name '*.h' -printf '/sourcedir/%P\0/destdir/%P\0' |
  xargs -r0n2 ln -s

Ou se/sourcedir éo diretório atual:

find "$PWD" -type l -name '*.h' -printf '%p\0/destdir/%P\0' |
  xargs -r0n2 ln -s

Responder3

findimprimirá nomes relativos aos caminhos que você fornece como argumentos. Neste caso, o caminho é ., então todos os nomes começarão com ./. Para obter caminhos absolutos, você precisa fornecer um caminho absoluto como entrada:

find "$PWD" -type l -name '*.h'

Este comando usa a $PWDvariável de ambiente, que contém o caminho absoluto do diretório de trabalho atual, portanto deve preservar o significado do seu comando original.

Responder4

find . -type l -name '*.h' -print0 | cut -z -c3- \
    | xargs -0 -I '{}' ln -s '/sourcedir/{}' '/destinationdir/{}'

man find

  • -print0imprima o nome completo do arquivo na saída padrão, seguido por um null caractere.

man cut- remova seções de cada linha de arquivos

  • -zo delimitador de linha é NUL, não nova linha.
  • -cselecione apenas esses caracteres.
  • N-do enésimo byte, caractere ou campo, contado de 1, até o final da linha.

man xargs- construir e executar linhas de comando a partir da entrada padrão.

  • xargs [options] [command [initial-arguments]]
  • -0Os itens de entrada são finalizados por um nullcaractere em vez de um espaço em branco, e as aspas e a barra invertida não são especiais (cada caractere é interpretado literalmente).
  • -I replace-str Substitua as ocorrências de replace-strin pelos initial-argumentsnomes lidos da entrada padrão. Além disso, os espaços em branco sem aspas não encerram os itens de entrada; em vez disso, o separador é o caractere de nova linha. Implica -L 1.
  • -L max-lines Use no máximo max-lineslinhas de entrada não vazias por linha de comando.

informação relacionada