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 でこの質問を見つけた場合に備えて、最終的な動作バージョンを以下に示します (ありがとうございます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" \;

関連情報