Jeg har forsøgt at oprette en find-kommandostreng, der finder alle filer, der slutter med et nummer 1-99, men ekskluderer alle andre .

f.eks Jeg vil finde myfile1 myfile99 men ikke myfile456 og ikke myfilebackup

Det regex, jeg tænker på, er myfile[1-9]{1,2} men jeg kan ikke få dette til at fungere med find.

find . -regex ".*myfile[0-9]{1,2}" ELLER find . -iname "myfile[0-9]{1,2}"

Fra hvad jeg kan se, er det {1,2} del, der ikke fungerer.

(forresten kan du bruge -name -regex ombytteligt?)

Enhver hjælp værdsat.

Kommentarer

  • -iname (og -name) brug globs , hvilket gør ikke har denne syntaks.

Svar

Du kan prøve

find . -regex ".*myfile[0-9][0-9]?" 

eller

find . \( -name "myfile[0-9][0-9]" -o -name "myfile[0-9]" \) 

Kommentarer

  • Tak – den første linje er worki ng for mig. Jeg havde prøvet dette med -iname, men jeg tror ikke ' det understøtter syntaksen, ellers gør jeg ' noget forkert.

Svar

Hvis du har GNU find, kan du bruge en anden type regulært udtryk:

find . -regextype sed -regex ".*myfile[0-9]\{1,2\}" 

Ifølge GNU bruger find en kastreret Emacs syntaks for regulært udtryk som standard – Emacs understøtter \{from,to\} syntaks, men i det mindste GNU find understøtter det ikke.

Mærkeligt nok indeholder referencemanualen ikke et afsnit om sed syntaks med regulært udtryk, så hvem ved hvilke dele af det understøttes.

Kommentarer

  • sed som ed synes at være et alias for posix-basic, så det skal være kompatibelt med POSIX BRE (selvom det understøtter nogle ex spændinger som \+). Det ' er ikke kompatibelt med GNU sed hvor f.eks. [\n] matcher en ny linje i stedet for tilbageslag eller n krævet af POSIX. Se også -regextype posix-extended for POSIX EREer (så .*myfile[0-9]{1,2}), også med udvidelser som \s eller \<
  • Jeg vidste aldrig om -regextype. Det ser ud til, at hvis du bruger -regextype egrep, ser det ud til at du kan undgå tilbageslag.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *