Find-Befehle scheinen mit Dateinamenbereichen nicht zu funktionieren

Find-Befehle scheinen mit Dateinamenbereichen nicht zu funktionieren
> 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 findfindet der Befehl nichts?

Antwort1

Verwendenfinds -regexOption zum Suchen von Dateinamen mit numerischem Suffix von 1bis 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}afterist ein zsh Klammernerweiterungsoperator (der jetzt auch von einigen anderen Shells unterstützt wird), derwenn nicht zitiertwird zu mehreren Argumenten erweitert: before1after, before2after, before3afterdie dann an den Befehl übergeben werden.

So wie Sie es zitieren, {1..11}bleibt es unverändert und findder -namePlatzhalter-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, findwü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 findImplementierung dies unterstützt.

Oder Sie könnten zshdas erweiterte rekursive Globbing von verwenden:

printf '%s\n' **/chr<1-11>.fasta

Dies würde auch mit chr01.fastaoder übereinstimmen chr011.fasta, Ihnen eine sortierte Liste liefern und versteckte Verzeichnisse überspringen.

Antwort3

Ändern Sie {} in [] und so:

find . -name '*chr[1-11].fasta'

verwandte Informationen