ln -s сообщает о сбое процедуры, но тем не менее создает символические ссылки

ln -s сообщает о сбое процедуры, но тем не менее создает символические ссылки

Я нахожусь в родительском каталоге, и в разных подкаталогах есть несколько файлов с расширениями .fastq, .fq, .fastq.gz и .fq.gz. Я создал подкаталог с именем FASTQC и хочу создать символические ссылки на все из них в этом подкаталоге.

Когда я пытаюсь:

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

Я получаю символические ссылки на все мои файлы в FASTQC, но также и следующие сообщения об ошибках:

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

Когда я вместо этого выполняю следующие две команды, все символические ссылки создаются без каких-либо сообщений об ошибках.

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" \;

Почему при выполнении первой команды появляются сообщения об ошибках?

EDIT: На случай, если кто-то найдет этот вопрос позже через Google, вот окончательная рабочая версия (спасибо, ilkkachuи steeldriver):

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

решение1

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

анализируется как

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

потому что (подразумевается)исвязывает сильнее, чемили. Вы, вероятно, хотите

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

чтобы фильтр ! -path-type) также применялся к *.gzфайлам. Финал -execтакже является частью подразумеваемогоицепочка, поэтому за исключением пар -oмежду ними, действия не нуждаются в скобках.

Полностью Ваше выражение:

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

Связанный контент