Ich befinde mich im übergeordneten Verzeichnis und dort befinden sich in verschiedenen Unterverzeichnissen mehrere Dateien mit den Erweiterungen .fastq, .fq, .fastq.gz und .fq.gz. Ich habe ein Unterverzeichnis mit dem Namen FASTQC erstellt und möchte symbolische Links zu allen Dateien in diesem Unterverzeichnis erstellen.
Wenn ich es versuche:
find "$PWD" \( ! -path "$PWD/FASTQC" -type f -name *.f*q -o -name *.f*q.gz \) -exec ln -sv {} "$PWD/FASTQC" \;
Ich erhalte symbolische Links zu allen meinen Dateien in FASTQC, aber auch die folgenden Fehlermeldungen:
ln: failed to create symbolic link '/XXX/YYY/ZZZ/aaa.fastq.gz': File exists
Wenn ich stattdessen die folgenden beiden Befehle ausführe, werden alle symbolischen Links ohne Fehlermeldungen erstellt.
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" \;
Warum erhalte ich beim ersten Befehl Fehlermeldungen?
BEARBEITEN: Falls jemand diese Frage später über Google findet, hier die endgültige Arbeitsversion (danke ilkkachu
und steeldriver
):
find "$PWD" ! -path "$PWD/FASTQC" -type f \( -name "*.f*q" -o -name "*.f*q.gz" \) \
-exec ln -sv {} "$PWD/FASTQC" \;
Antwort1
( ! -path "..." -type f -name ... -o -name ...gz ) -exec ...
wird analysiert als
( ( ! -path "..." -type f -name ... ) -o ( -name ...gz ) ) -exec ...
weil (das implizierte)Undbindet stärker alsoder. Sie möchten wahrscheinlich
! -path "..." -type f ( -name ... -o -name ...gz ) -exec
um den ! -path
(und -type
) Filter *.gz
auch auf Dateien anzuwenden. Das Finale -exec
ist auch Teil des impliziertenUndKette, daher müssen die Aktionen, außer dem Paar mit -o
dazwischen, nicht in Klammern gesetzt werden.
Mit Ihrem vollständigen Ausdruck:
find "$PWD" ! -path "$PWD/FASTQC" -type f \( -name *.f*q -o -name *.f*q.gz \) \
-exec ln -sv {} "$PWD/FASTQC" \;