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

次の2つのコマンドを実行すると、エラーメッセージなしですべてのシンボリックリンクが生成されます。

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

最初のコマンドを使用するとエラーメッセージが表示されるのはなぜですか?

編集:後でGoogleでこの問題を発見した場合に備えて、最終的な作業バージョンは次のとおりです(ありがとうございます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" \;

関連情報