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

1

Eu estou no diretório pai e há vários arquivos com extensões .fastq, .fq, .fastq.gz e .fq.gz em subdiretórios diferentes. Eu criei um subdiretório chamado FASTQC e quero 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" \;

Eu 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: No caso de alguém encontrar esta questão mais tarde através do Google, aqui está a versão final de trabalho (obrigado, ilkkachu e steeldriver ):

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

1 resposta

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

é analisado como

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

porque (o implícito) e se liga mais strong que ou . Você provavelmente quer

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

para que o filtro ! -path (e -type ) se aplique aos arquivos *.gz também. O% final -exec também faz parte da cadeia e implícita, portanto, além do par com -o intermediário, as ações não precisam de parênteses ao redor 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" \;
    
por 26.05.2017 / 15:25

Tags