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

為什麼我在使用第一個命令時會收到錯誤訊息?

編輯:如果有人後來透過谷歌發現這個問題,這裡是最終的工作版本(謝謝,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" \;

相關內容