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
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
somed
synes at være et alias forposix-basic
, så det skal være kompatibelt med POSIX BRE (selvom det understøtter nogle ex spændinger som\+
). Det ' er ikke kompatibelt med GNUsed
hvor f.eks.[\n]
matcher en ny linje i stedet for tilbageslag ellern
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.
-iname
(og-name
) brug globs , hvilket gør ikke har denne syntaks.