我在父目錄中,不同的子目錄中有許多副檔名為 .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" \;