Я нахожусь в родительском каталоге, и в разных подкаталогах есть несколько файлов с расширениями .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" \;