Pokouším se vytvořit příkazový řetězec find, který najde všechny soubory, které končí číslem 1-99, ale vylučují všechny ostatní .
např Chci najít myfile1 myfile99 , ale ne myfile456 a ne myfilebackup
Regex, na který myslím, je myfile[1-9]{1,2}
ale nemohu s tím najít práci.
find . -regex ".*myfile[0-9]{1,2}"
NEBO find . -iname "myfile[0-9]{1,2}"
Z toho, co vidím, je část {1,2}
, která nefunguje.
(mimochodem můžete použít -name -regex
zaměnitelně?)
Oceníte jakoukoli pomoc.
Komentáře
Odpověď
Můžete zkusit
find . -regex ".*myfile[0-9][0-9]?"
nebo
find . \( -name "myfile[0-9][0-9]" -o -name "myfile[0-9]" \)
Komentáře
- Děkuji – první řádek je pracovat ng pro mě. Zkoušel jsem to s -iname, ale ' si nemyslím, že to podporuje syntaxi, nebo jinak ' dělám něco špatně.
Odpověď
Pokud máte GNU find, můžete použít jiný typ regulárního výrazu:
find . -regextype sed -regex ".*myfile[0-9]\{1,2\}"
Podle GNU find
používá kastrovaný Syntax regulárního výrazu Emacs ve výchozím nastavení – Emacs podporuje \{from,to\}
syntaxi, ale alespoň GNU find
nepodporuje to.
Kupodivu referenční příručka neobsahuje sekci o syntaxi regulárního výrazu sed
, takže kdo ví, které jeho části jsou podporovány.
Komentáře
-
sed
jakoed
se zdá být aliasem proposix-basic
, takže by měl být kompatibilní s POSIX BRE (ačkoli podporuje některé ex napětí jako\+
). Není ' kompatibilní s GNUsed
, kde například[\n]
odpovídá novému řádku namísto zpětné lomítko nebon
vyžadované POSIXem. Viz také-regextype posix-extended
pro POSIX ERE (tedy.*myfile[0-9]{1,2}
), také s příponami jako\s
nebo\<
- Nikdy jsem o -regextype nevěděl. Zdá se, že pokud použijete
-regextype egrep
, zdá se, že se můžete vyhnout zpětným lomítkům.
-iname
(a-name
) použít glob , které ano tuto syntaxi nemají.