> ls
chr10_canu.fasta chr11.fasta chr2_canu.fasta chr3.fasta chr5_canu.fasta chr6.fasta chr8_canu.fasta chr9.fasta
chr10.fasta chr1_canu.fasta chr2.fasta chr4_canu.fasta chr5.fasta chr7_canu.fasta chr8.fasta circoletto_pbs.sh
chr11_canu.fasta chr1.fasta chr3_canu.fasta chr4.fasta chr6_canu.fasta chr7.fasta chr9_canu.fasta
> find . -name "chr{1..11}.fasta"
Warum find
findet der Befehl nichts?
Antwort1
Verwendenfind
s -regex
Option zum Suchen von Dateinamen mit numerischem Suffix von 1
bis 11
:
find . -type f -regex ".*/chr\([1-9]\|1[01]\)\.fasta"
-regex
Muster
Dateiname stimmt mit regulärem Ausdruck übereinMuster. Dies ist eine Übereinstimmung auf dem gesamten Pfad, keine Suche.
Antwort2
before{1..3}after
ist ein zsh Klammernerweiterungsoperator (der jetzt auch von einigen anderen Shells unterstützt wird), derwenn nicht zitiertwird zu mehreren Argumenten erweitert: before1after
, before2after
, before3after
die dann an den Befehl übergeben werden.
So wie Sie es zitieren, {1..11}
bleibt es unverändert und find
der -name
Platzhalter-Matching-Operator von behandelt diese nicht {1..11}
speziell, sodass nur nach Dateien mit dem wörtlichen Namen gesucht wird chr{1..11}.fasta
.
Selbst wenn Sie es nicht in Anführungszeichen setzen würden, find
wüssten Sie nicht, was Sie damit anfangen sollten:
find . -name chr1.fasta chr2.fasta...
Damit es nützlich ist, müsste es sein:
find . \( -name chr1.fast -o -name chr2.fasta... \)
und Sie können den Operator nicht verwenden, {x..y}
um dies direkt zu erreichen.
In diesem Fall könnten Sie Folgendes tun:
find . \( -name 'chr[1-9].fast -o -name 'chr1[01].fasta' \) ...
Oder das Regexp-Äquivalent, wenn Ihre find
Implementierung dies unterstützt.
Oder Sie könnten zsh
das erweiterte rekursive Globbing von verwenden:
printf '%s\n' **/chr<1-11>.fasta
Dies würde auch mit chr01.fasta
oder übereinstimmen chr011.fasta
, Ihnen eine sortierte Liste liefern und versteckte Verzeichnisse überspringen.
Antwort3
Ändern Sie {} in [] und so:
find . -name '*chr[1-11].fasta'