ln -s relata que um procedimento falhou, mas mesmo assim cria links simbólicos

ln -s relata que um procedimento falhou, mas mesmo assim cria links simbólicos

Estou no diretório pai e há vários arquivos com extensões .fastq, .fq, .fastq.gz e .fq.gz em diferentes subdiretórios. Criei um subdiretório chamado FASTQC e desejo criar links simbólicos para todos eles nesse subdiretório.

Quando eu tento:

find "$PWD" \( ! -path "$PWD/FASTQC" -type f -name *.f*q -o -name *.f*q.gz \) -exec ln -sv {} "$PWD/FASTQC" \;

Recebo links simbólicos para todos os meus arquivos no FASTQC, mas também as seguintes mensagens de erro:

ln: failed to create symbolic link '/XXX/YYY/ZZZ/aaa.fastq.gz': File exists

Quando executo os dois comandos a seguir, recebo todos os links simbólicos criados sem nenhuma mensagem de erro.

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 que recebo mensagens de erro com o primeiro comando?

EDIT: Caso alguém encontre esta pergunta posteriormente através do Google, aqui está a versão final de trabalho (obrigado ilkkachue steeldriver):

find "$PWD" ! -path "$PWD/FASTQC" -type f \( -name "*.f*q" -o -name "*.f*q.gz" \) \
    -exec ln -sv {} "$PWD/FASTQC" \;

Responder1

( ! -path "..." -type f -name ... -o -name ...gz ) -exec ...

é analisado como

( ( ! -path "..." -type f -name ... ) -o ( -name ...gz ) ) -exec ...

porque (o implícito)eliga mais forte do queou. Você provavelmente quer

! -path "..." -type f ( -name ... -o -name ...gz ) -exec

para que o filtro ! -path(e -type) *.gztambém se aplique aos arquivos. A final -exectambém faz parte do implícitoecadeia, portanto, exceto o par intermediário -o, as ações não precisam de parênteses em torno delas.

Com sua expressão completa:

find "$PWD" ! -path "$PWD/FASTQC" -type f \( -name *.f*q -o -name *.f*q.gz \) \
    -exec ln -sv {} "$PWD/FASTQC" \;

informação relacionada