
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
find
imprimirá 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 $PWD
variá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/{}'
-print0
imprima o nome completo do arquivo na saída padrão, seguido por umnull
caractere.
man cut
- remova seções de cada linha de arquivos
-z
o delimitador de linha éNUL
, não nova linha.-c
selecione 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]]
-0
Os itens de entrada são finalizados por umnull
caractere 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 dereplace-str
in pelosinitial-arguments
nomes 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áximomax-lines
linhas de entrada não vazias por linha de comando.