Как бы вы рассказывали, существуют ли файлы определенного расширения в каталоге, bash?
Что-то вроде
if [ -e *.flac ]; then
echo true;
fi
Как бы вы рассказывали, существуют ли файлы определенного расширения в каталоге, bash?
Что-то вроде
if [ -e *.flac ]; then
echo true;
fi
#!/bin/bash
count=`ls -1 *.flac 2>/dev/null | wc -l`
if [ $count != 0 ]
then
echo true
fi
#/bin/bash
myarray=(`find ./ -maxdepth 1 -name "*.py"`)
if [ ${#myarray[@]} -gt 0 ]; then
echo true
else
echo false
fi
Это использует ls (1), если не существует файлов flac, ls сообщает об ошибке и script завершает; othewise script продолжается, и файлы могут быть обработаны
#! /bin/sh
ls *.flac >/dev/null || exit
## Do something with flac files here
shopt -s nullglob
if [[ -n $(echo *.flac) ]] # or [ -n "$(echo *.flac)" ]
then
echo true
fi
Вам нужно быть аккуратным, какой флаг вы вводите в свой оператор if
, и как он относится к желаемому результату.
Если вы хотите проверить только обычные файлы, а не другие типы записей в файловой системе, вам нужно сменить скелет кода на:
if [ -f file ]; then
echo true;
fi
Использование -f
ограничивает if
регулярными файлами, тогда как -e
является более экспансивным и соответствует всем типам записей в файловой системе. Конечно, есть и другие варианты, например -d
для каталогов и т.д. См. http://tldp.org/LDP/abs/html/fto.html для хорошего перечисления.
Как указано @msw, test
(т.е. [
) задохнется, если вы попробуете подать более одного аргумента. Это может произойти в вашем случае, если glob для *.flac
возвратил более одного файла. В этом случае попробуйте обернуть тест if
в цикле, например:
for file in ./*.pdf
do
if [ -f "${file}" ]; then
echo 'true';
break
fi
done
Таким образом, вы break
в первом экземпляре расширения файла, который хотите, и можете продолжать работу с остальной частью script.
#!/bin/bash
files=$(ls /home/somedir/*.flac 2> /dev/null | wc -l)
if [ "$files" != "0" ]
then
echo "Some files exists."
else
echo "No files with that extension."
fi
shopt -s nullglob
set -- $(echo *.ext)
if [ "${#}" -gt 0 ];then
echo "got file"
fi
Верхнее решение (if [ -e *.flac ];)
не работало для меня, давая: [: too many arguments
if ls *.flac >/dev/null 2>&1;
, тогда он будет работать.
bash:
any_with_ext () (
ext="$1"
any=false
shopt -s nullglob
for f in *."$ext"; do
any=true
break
done
echo $any
)
if $( any_with_ext flac ); then
echo "have some flac"
else
echo "dir is flac-free"
fi
Я использую круглые скобки вместо фигурных скобок, чтобы обеспечить использование подоболочки (не хотите сжимать текущую настройку nullglob
).
Вот решение, не использующее внешних команд (т.е. no ls
), но вместо этого используется функция оболочки. Протестировано в bash:
shopt -s nullglob
function have_any() {
[ $# -gt 0 ]
}
if have_any ./*.flac; then
echo true
fi
Функция have_any
использует $#
для подсчета своих аргументов, а [ $# -gt 0 ]
затем проверяет, существует ли хотя бы один аргумент. Использование ./*.flac
вместо *.flac
в вызове have_any
заключается в том, чтобы избежать проблем, вызванных файлами с именами типа --help
.