Проверьте, есть ли у шара какие-либо совпадения в bash - PullRequest
202 голосов
/ 30 мая 2010

Если я хочу проверить наличие одного файла, я могу проверить его, используя test -e filename или [ -e filename ].

Предположим, у меня есть глобус и я хочу знать, существуют ли какие-либо файлычьи имена совпадают с глобусом.Глобус может соответствовать 0 файлам (в этом случае мне ничего не нужно делать), или он может соответствовать 1 или более файлам (в этом случае мне нужно что-то делать).Как я могу проверить, есть ли у шара какие-либо совпадения?(Мне все равно, сколько совпадений, и было бы лучше, если бы я мог сделать это с одним оператором if и без циклов (просто потому, что я считаю это наиболее читаемым).

(test -e glob* не удается, если глобус соответствует более чем одному файлу.)

Ответы [ 18 ]

1 голос
/ 27 июля 2017

Я не видел этого ответа, поэтому подумал, что выложу его там:

set -- glob*
[ -f "$1" ] && echo "found $@"
1 голос
/ 30 августа 2010

Эта мерзость, кажется, работает:

#!/usr/bin/env bash
shopt -s nullglob
if [ "`echo *py`" != "" ]; then
    echo "Glob matched"
else
    echo "Glob did not match"
fi

Вероятно, требуется bash, а не sh.

Это работает, потому что опция nullglob заставляет глобус вычислять пустую строку, если совпадений нет. Таким образом, любой непустой вывод команды echo указывает, что глобус соответствует чему-либо.

0 голосов
/ 27 июля 2017
[ `ls glob* 2>/dev/null | head -n 1` ] && echo true
0 голосов
/ 08 апреля 2016

ls | grep -q "glob.*"

Не самое эффективное решение (если в каталоге тонна файлов, оно может быть медленным), но оно простое, легко читаемое и имеет то преимущество, что регулярные выражения более мощные, чем простые шаблоны bash glob.

0 голосов
/ 30 мая 2010
(ls glob* &>/dev/null && echo Files found) || echo No file found
0 голосов
/ 30 мая 2010
if ls -d $glob > /dev/null 2>&1; then
  echo Found.
else
  echo Not found.
fi

Обратите внимание, что это может занять очень много времени, если много совпадений или медленный доступ к файлу.

0 голосов
/ 18 июля 2018
set -- glob*
if [ -f "$1" ]; then
  echo "It matched"
fi

Объяснение

Если не найдено совпадений для glob*, тогда $1 будет содержать 'glob*'. Тест -f "$1" не будет верным, поскольку файл glob* не существует.

Почему это лучше, чем альтернативы

Это работает с sh и производными: ksh и bash. Он не создает никаких вложенных оболочек. Команды $(..) и `...` создают вложенную оболочку; они разворачивают процесс и поэтому работают медленнее, чем это решение.

0 голосов
/ 30 мая 2010
#!/bin/bash
set nullglob
touch /tmp/foo1 /tmp/foo2 /tmp/foo3
FOUND=0
for FILE in /tmp/foo*
do
    FOUND=$((${FOUND} + 1))
done
if [ ${FOUND} -gt 0 ]; then
    echo "I found ${FOUND} matches"
else
    echo "No matches found"
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...