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

为什么我在使用第一个命令时会收到错误消息?

编辑:如果有人后来通过谷歌发现这个问题,这里是最终的工作版本(谢谢,ilkkachusteeldriver):

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

相关内容