2010-11-29 4 views
10

В Bash, как соотносится регулярное выражение с несколькими критериями в отношении имени файла? Например, я хотел бы сопоставить все файлы с окончанием .txt или .log.Регулярные выражения для сопоставления имен файлов

Я знаю, как соответствовать один тип критериев:

for file in *.log 
do 
     echo "${file}" 
done 

Что такое синтаксис для логического или соответствовать двум или более типов критериев?

ответ

14

Сделайте это так же, как вы бы вызвали ls. Можно указать несколько подстановочных знаков один за другим:

for file in *.log *.txt 
+0

В основном работает, но только странно, что, когда у меня нет файлов .txt, «.txt» получает echo'ed. – Mike 2010-11-29 20:33:07

+2

@Mike вам нужно установить опцию оболочки nullglob, используя butting shopt, чтобы избежать этого – thkala 2010-11-29 20:47:11

3

Вы просто добавить другие условия к концу:

for VARIABLE in 1 2 3 4 5 .. N 
do 
    command1 
    command2 
    commandN 
done 

Так что в вашем случае:

for file in *.log *.txt 
do 
     echo "${file}" 
done 
17

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

3

Вы также можете сделать это:

shopt -s extglob 
for file in *.+(log|txt) 

, который может быть легко расширена на более альтернатив:

for file in *.+(log|txt|mp3|gif|foo) 
Смежные вопросы