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 ilkkachu
e 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
) *.gz
também se aplique aos arquivos. A final -exec
també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" \;