Use o resultado da busca sem ./

6

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

find . -type l -name '*.h' -exec ln -s /sourcedir/{} /destinationdir/{} \;
    
por Mark Robinson 12.04.2013 / 13:34

3 respostas

8

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

find * -type l -name '*.h' -exec ln -s /sourcedir/{} /destinationdir/{} \;
#    ^
    
por 12.04.2013 / 15:00
6

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 o GNUisms, você poderia fazer:

find . -type l -name '*.h' -printf '/sourcedir/%P
find "$PWD" -type l -name '*.h' -printf '%p
S=/sourcedir D=/destdir find . -type l -name '*.h' -exec sh -c '
  for i do
    ln -s -- "$S${i#.}" "$D/$i"
  done' sh {} +
/destdir/%P
find . -type l -name '*.h' -printf '/sourcedir/%P
find "$PWD" -type l -name '*.h' -printf '%p%pre%/destdir/%P%pre%' |
  xargs -r0n2 ln -s
/destdir/%P%pre%' | xargs -r0n2 ln -s
' | xargs -r0n2 ln -s
/destdir/%P%pre%' | xargs -r0n2 ln -s

Ou se /sourcedir for o diretório atual:

%pre%     
por 12.04.2013 / 13:42
0

find imprimirá nomes relativos aos caminhos que você fornecer como argumentos. Nesse 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'

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

    
por 12.04.2013 / 13:42

Tags