Bash не поддерживает регулярные выражения как таковые, когда globbing (filena мне подходит). Его синтаксис globbing, однако, может быть весьма универсальным. Например:
for i in A*B.{log,txt,r[a-z][0-9],c*} Z[0-5].c; do
...
done
будет применять содержимое цикла для всех файлов, которые начинаются с A и заканчиваются в B, то точка, и любой из следующих расширений:
- бревенчатых
- TXT
- г с последующим строчной буквы следуют одна цифра
- с последующим почти ничего
Он также применит команды цикла к файлу, начинающемуся с Z, за которым следует цифра в диапазоне 0-5, а затем с расширением .c.
Если вы действительно хотите/должны, вы можете включить расширенную подстановку с shopt: встроенной командой
shopt -s extglob
, который затем позволяет значительно больше возможностей, в то время как соответствующие имена файлы, такие как подшаблоны т.д.
Смотрите руководство по Bash для получения дополнительной информации о поддерживаемых выражениях:
http://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching
EDIT:
Если выражение не соответствует имени файла, bash по умолчанию заменит само выражение (например, это будет echo * .txt), а не пустая строка. Вы можете изменить это поведение, установив параметр оболочки nullglob:
shopt -s nullglob
Это заменит * .txt, который не имеет соответствующих файлов с пустой строкой.
EDIT 2:
Я полагаю, что вы также проверить shopt
предопределённую и его варианту, так как очень немногие из них влияют на имя файла по шаблону, а также другие аспекты оболочки:
http://www.gnu.org/software/bash/manual/bash.html#The-Shopt-Builtin
В основном работает, но только странно, что, когда у меня нет файлов .txt, «.txt» получает echo'ed. – Mike 2010-11-29 20:33:07
@Mike вам нужно установить опцию оболочки nullglob, используя butting shopt, чтобы избежать этого – thkala 2010-11-29 20:47:11