Как я могу проверить, существует ли файл, используя шаблоны?

У меня есть каталог с полными резервными копиями svn, названный так:

name1.20100412.r9.bz2
name1.20100413.r10.bz2
name2.20100411.r101.bz2
name3.20100412.r102.bz2
...

Мне нужно проверить, существует ли файл резервной копии, используя только имя и номер версии. Я попробовал test, но это не сработало:

if [ -e name1.*.r9.bz2 ]; then echo exists; fi
[: too many arguments

Как я могу проверить, существует ли файл?


sh
person planetp    schedule 13.04.2010    source источник
comment
Что говорит echo name1.*.r9.bz2? Похоже, у вас есть более одной резервной копии ревизии 9!   -  person Jens    schedule 16.05.2012
comment
Хорошие ответы: stackoverflow.com/questions/6363441/ . Самый простой способ: используйте ls. Лучший способ: используйте find.   -  person jrouquie    schedule 02.11.2014


Ответы (6)


Просто проверьте, расширила ли оболочка шаблон. Это работает в sh и bash:

pattern="name1.*.r9.bz2"

if [ "$(echo $pattern)" != "$pattern" ]; then
    echo exists
fi

P.S. Если сам шаблон может быть допустимым именем файла, вы можете добавить проверку -e:

if [ -e "$pattern" -o "$(echo $pattern)" != "$pattern" ]; then
    echo exists
fi
person Eugene Yarmash    schedule 13.04.2010
comment
Это не удастся, если у вас есть файл с именем name1.*.r9.bz2. - person melpomene; 31.05.2018
comment
Я добавил и этот случай. - person Eugene Yarmash; 31.05.2018

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

shopt -s nullglob
set -- name1.*.r9.bz2
if [ -n "$1" ]; then echo exists; fi

or

pattern="name1.*.r9.bz2"
if [ "$(echo $pattern)" != "$pattern" ]; then echo exists; fi

Изменить: добавлено shopt -s nullglob.

person Dennis Williamson    schedule 04.11.2010

Небольшая вариация на ответ Евгения Y:

test "$(echo name1.*.r9.bz2)" != "name1.*.r9.bz2" && echo exists
person michaeljt    schedule 18.09.2012

Я хотел бы использовать:

if ls name1.*.r9.bz2 &> /dev/null ; then
  echo exists
fi
person Marco Leogrande    schedule 29.09.2012

Попробуйте что-то вроде

FILES=(`ls name1.*.r9.bz2`)
if [ ${#FILES[@]} -gt 0 ]; then
  echo "Files!"
else
  echo "No Files"
fi
person Josh Knauer    schedule 13.04.2010
comment
Создает уродливые сообщения на stderr, когда файлы не существуют. - person Jens; 05.02.2013

Связанный пост: Проверьте, существует ли файл с подстановочным знаком в оболочке сценарий

Кажется, у него есть хороший ответ, использующий возвращаемое значение ls.

person adam.r    schedule 22.09.2013