![Как проверить, существует ли один или несколько файлов с префиксом в bash? Например, [[-f foo*]]](https://rvso.com/image/178564/%D0%9A%D0%B0%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%B8%D1%82%D1%8C%2C%20%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D1%83%D0%B5%D1%82%20%D0%BB%D0%B8%20%D0%BE%D0%B4%D0%B8%D0%BD%20%D0%B8%D0%BB%D0%B8%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%20%D1%81%20%D0%BF%D1%80%D0%B5%D1%84%D0%B8%D0%BA%D1%81%D0%BE%D0%BC%20%D0%B2%20bash%3F%20%D0%9D%D0%B0%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%2C%20%5B%5B-f%20foo*%5D%5D.png)
Есть ли способ использоватьРасширение имени файлав пределахtest
выражение, а точнее,условное выражение bash?
Например:
[[ -f foo* ]] && echo 'found it!' || echo 'nope!';
... выведет"неа!"существует ли foobar
файл в текущем каталоге или нет.
И добавляем var
лайк...
bar=foo*
[[ -f `echo $bar` ]] && echo 'found it!' || echo 'nope!';
... выведет"нашел!"если foobar
файл существует, но только если echo $bar
расширение вернуло только один файл.
решение1
Далее предполагается, что вас не волнует, соответствует ли глоб каким-либо файлам, включая специальные файлы блоков, специальные файлы символов, каталоги, символические ссылки и т. д.
Это идеальный вариант использования для failglob
:
shopt -s failglob
if echo foo* &>/dev/null
then
# files found
else
# no files found
fi
Или, если вам нужен список файлов, если они существуют:
shopt -s failglob
files=(foo*)
if [[ "${#files[@]}" -eq 0 ]]
then
# no files found
else
# files found
fi
Если ошибка «Файлы не найдены» — это можно упростить:
set -o errexit
shopt -s failglob
files=(foo*)
# We know that the expansion succeeded if we reach this line
Старый ответ
Это может быть (редко!) допустимым использованием ls
в сценарии:
if ls foo* &>/dev/null
then
…
else
…
fi
В качестве альтернативы, find foo* -maxdepth 0 -printf ''
.
решение2
На основеэтот ответ, мы можем использовать, shopt -s nullglob
чтобы гарантировать, что notify будет возвращен, если каталог пуст:
[[ -n "$(shopt -s nullglob; echo foo*)" ]] && echo 'found it!' || echo 'nope!';
решение3
Для полноты картины приведем несколько примеров использования find
:
#!/bin/bash
term=$1
if find -maxdepth 1 -type f -name "$term*" -print -quit | grep -q .; then
echo "found"
else
echo "not found"
fi
if [ -n "$(find -maxdepth 1 -type f -name "$term*" -print -quit)" ]; then
echo "found"
else
echo "not found"
fi
И несколько тестов:
user@host > find -type f
./foobar
./bar/foo
./bar/bar
./find_prefixed_files.sh
./ba
user@host > ./find_prefixed_files.sh foo
found
found
user@host > ./find_prefixed_files.sh bar
not found
not found