Utilice el resultado de búsqueda sin ./

Utilice el resultado de búsqueda sin ./

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

findimprimirá 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 $PWDvariable 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/{}'

man find

  • -print0Imprima el nombre completo del archivo en la salida estándar, seguido de un null carácter.

man cut- eliminar secciones de cada línea de archivos

  • -zEl delimitador de línea es NUL, no una nueva línea.
  • -cseleccione 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]]
  • -0Los elementos de entrada terminan con un nullcará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 de replace-stren initial-argumentscon 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áximo max-lineslíneas de entrada que no estén en blanco por línea de comando.

información relacionada