
Estoy intentando usar buscar para crear un montón de enlaces simbólicos, pero uso el resultado con {} incluye ./ antes de cada nombre de archivo. ¿Cómo puedo evitar eso?
find . -type l -name '*.h' -exec ln -s /sourcedir/{} /destinationdir/{} \;
Respuesta1
Sólo tienes que cambiar un carácter en tu comando:
find * -type l -name '*.h' -exec ln -s /sourcedir/{} /destinationdir/{} \;
# ^
Respuesta2
Utilice la sintaxis estándar, como:
S=/sourcedir D=/destdir find . -type l -name '*.h' -exec sh -c '
for i do
ln -s -- "$S${i#.}" "$D/$i"
done' sh {} +
Si desea utilizar GNUisms, puede hacer:
find . -type l -name '*.h' -printf '/sourcedir/%P\0/destdir/%P\0' |
xargs -r0n2 ln -s
O si/sourcedir
esel directorio actual:
find "$PWD" -type l -name '*.h' -printf '%p\0/destdir/%P\0' |
xargs -r0n2 ln -s
Respuesta3
find
imprimirá nombres relativos a las rutas que proporcione como argumentos. En este caso, la ruta es .
, por lo que todos los nombres comenzarán con ./
. Para obtener rutas absolutas, debe proporcionar una ruta absoluta como entrada:
find "$PWD" -type l -name '*.h'
Este comando utiliza la $PWD
variable de entorno, que contiene la ruta absoluta del directorio de trabajo actual, por lo que debe conservar el significado de su comando original.
Respuesta4
find . -type l -name '*.h' -print0 | cut -z -c3- \
| xargs -0 -I '{}' ln -s '/sourcedir/{}' '/destinationdir/{}'
-print0
Imprima el nombre completo del archivo en la salida estándar, seguido de unnull
carácter.
man cut
- eliminar secciones de cada línea de archivos
-z
El delimitador de línea esNUL
, no una nueva línea.-c
seleccione sólo estos caracteres.N-
desde el enésimo byte, carácter o campo, contado desde 1, hasta el final de la línea.
man xargs
- construir y ejecutar líneas de comando desde la entrada estándar.
xargs [options] [command [initial-arguments]]
-0
Los elementos de entrada terminan con unnull
carácter en lugar de con un espacio en blanco, y las comillas y la barra invertida no son especiales (cada carácter se toma literalmente).-I replace-str
Reemplace las apariciones dereplace-str
eninitial-arguments
con nombres leídos de la entrada estándar. Además, los espacios en blanco sin comillas no terminan los elementos de entrada; en cambio, el separador es el carácter de nueva línea. Implica-L 1
.-L max-lines
Utilice como máximomax-lines
líneas de entrada que no estén en blanco por línea de comando.