Primeiro, use sempre {}
como um argumento separado em find -exec …
. Usar stuff{}morestuff
funciona com algumas (não todas) versões de find
, mas não pode lidar com nomes de arquivos contendo caracteres “incomuns”, como espaço em branco, '
, "
, etc. (exatamente quais caracteres causam problema depende exatamente onde você usa {}
). Passe {}
como um argumento separado. O primeiro argumento depois de sh -c CODE
é $0
. Não esqueça as aspas duplas em torno da expansão das variáveis .
find … -exec sh -c 'ln -s /some/other/path/$(basename "$0") "$0"' {} \;
(eu também simplifiquei as citações para usar aspas simples em todas as partes).
Existe pelo menos um outro problema com o seu comando. Você está tentando criar um link simbólico no local retornado por find
, onde por construção já existe um link simbólico. Parece que você pretendia criar um link simbólico em /some/other/path
, e nesse caso você precisa trocar os argumentos para ln
(como com mv
e cp
, os arquivos existentes vêm em primeiro lugar, e o destino vem por último).
find /some/path/* -maxdepth 0 -exec sh -c 'ln -s "$0" /some/other/path/$(basename "$0")' {} \;
Você pode tornar isso mais rápido usando construções de manipulação de string do shell em vez de basename
e invocando sh
em lotes por vez.
find /some/path/* -maxdepth 0 -exec sh -c '
for x do
ln -s "$x" /some/other/path/${x##*/};
done' {} +
Se esse for seu comando find
real, find
não será útil aqui. O ponto de find
é recorrer aos subdiretórios. Um achado não-recursivo às vezes pode ser útil para tirar proveito de seus filtros (por exemplo, para atuar somente em arquivos de um determinado tipo ou modificados dentro de um certo intervalo de tempo). Mas um find
não recursivo sem filtragem é inútil.
for x in /some/path/*; do
ln -s "$x" "/some/other/path/${x##*/}";
done' {} +
Ou
cd /some/path
for x in *; do
ln -s "$PWD/$x" "/some/other/path/$x";
done' {} +
Como alternativa, com zsh :
autoload -U zmv
alias zln='zmv -L'
zln -s '/some/path/*' '/some/other/path/$f:t'