我在父目录中,不同的子目录中有许多扩展名为 .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" \;
为什么我在使用第一个命令时会收到错误消息?
编辑:如果有人后来通过谷歌发现这个问题,这里是最终的工作版本(谢谢,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" \;