Estoy en el directorio principal y hay varios archivos con extensiones .fastq, .fq, .fastq.gz y .fq.gz en diferentes subdirectorios. Creé un subdirectorio llamado FASTQC y quiero crear enlaces simbólicos a todos ellos en ese subdirectorio.
Cuando lo intento:
find "$PWD" \( ! -path "$PWD/FASTQC" -type f -name *.f*q -o -name *.f*q.gz \) -exec ln -sv {} "$PWD/FASTQC" \;
Recibo enlaces simbólicos a todos mis archivos en FASTQC, pero también los siguientes mensajes de error:
ln: failed to create symbolic link '/XXX/YYY/ZZZ/aaa.fastq.gz': File exists
Cuando ejecuto los siguientes dos comandos, obtengo todos los enlaces simbólicos creados sin ningún mensaje de error.
find "$PWD" \( ! -path "$PWD/FASTQC" -type f -name *.f*q \) -exec ln -sv {} "$PWD/FASTQC" \;
find "$PWD" \( ! -path "$PWD/FASTQC" -type f -name *.f*q.gz \) -exec ln -sv {} "$PWD/FASTQC" \;
¿Por qué recibo mensajes de error con el primer comando?
EDITAR: En caso de que alguien encuentre esta pregunta más adelante a través de Google, aquí está la versión final funcional (gracias ilkkachu
y steeldriver
):
find "$PWD" ! -path "$PWD/FASTQC" -type f \( -name "*.f*q" -o -name "*.f*q.gz" \) \
-exec ln -sv {} "$PWD/FASTQC" \;
Respuesta1
( ! -path "..." -type f -name ... -o -name ...gz ) -exec ...
se analiza como
( ( ! -path "..." -type f -name ... ) -o ( -name ...gz ) ) -exec ...
porque (el implícito)yse une más fuerte queo. probablemente quieras
! -path "..." -type f ( -name ... -o -name ...gz ) -exec
para que el filtro ! -path
(y -type
) se aplique también a *.gz
los archivos. La final -exec
también forma parte de lo implícitoycadena, por lo que, aparte del par -o
intermedio, las acciones no necesitan paréntesis alrededor de ellas.
Con tu expresión completa:
find "$PWD" ! -path "$PWD/FASTQC" -type f \( -name *.f*q -o -name *.f*q.gz \) \
-exec ln -sv {} "$PWD/FASTQC" \;