Тест, имеет ли шарик какие-либо соответствия в ударе

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

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

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

213
задан Brian Chrisman 9 September 2018 в 06:49
поделиться

6 ответов

if ls -d $glob > /dev/null 2>&1; then
  echo Found.
else
  echo Not found.
fi

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

0
ответ дан 23 November 2019 в 04:27
поделиться
#!/usr/bin/env bash

# If it is set, then an unmatched glob is swept away entirely -- 
# replaced with a set of zero words -- 
# instead of remaining in place as a single word.
shopt -s nullglob

M=(*px)

if [ "${#M[*]}" -ge 1 ]; then
    echo "${#M[*]} matches."
else
    echo "No such files."
fi
24
ответ дан 23 November 2019 в 04:27
поделиться

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

M=(*py)
if [ -e ${M[0]} ]; then
  echo Found
else
  echo Not Found
fi
4
ответ дан 23 November 2019 в 04:27
поделиться
#!/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
0
ответ дан 23 November 2019 в 04:27
поделиться
(ls glob* &>/dev/null && echo Files found) || echo No file found
-1
ответ дан 23 November 2019 в 04:27
поделиться

Похоже, эта мерзость работает:

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

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

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

1
ответ дан 23 November 2019 в 04:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: