親ディレクトリにいますが、さまざまなサブディレクトリに .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" \;