Как вы расскажете, существуют ли файлы определенного расширения в каталоге, с 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
Вы должны быть carful флагом которой вы бросаете в свой 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
на первый экземпляр расширения файла, который вы хотите и можете продолжать идти с остальной частью сценария.
за исключением 'test' (так называемый' [ ') жалуется, если шаблон расширяется более чем один файл:«ожидается бинарный оператор "или" слишком много аргументов " – msw
@msw - спасибо, я даже не думал об этой проблеме. Я попытался изменить свой ответ, чтобы принять его во внимание. – dtlussier
Вы должны указать переменную, т. Е. Использовать '' $ file "', потому что имя файла может содержать некоторые плохие символы, такие как пробелы или звездочки. –
#!/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
#/bin/bash
myarray=(`find ./ -maxdepth 1 -name "*.py"`)
if [ ${#myarray[@]} -gt 0 ]; then
echo true
else
echo false
fi
Это хорошо, потому что вы можете на самом деле * сделать что-то с файлами после их поиска. – ephsmith
+1 для обертывания подголовника, находящегося в скобках, чтобы myarray использовать переменную массива. В противном случае, если find не возвращает результат '$ {# myarray [@]}' равно 1 – shaffooo
shopt -s nullglob
set -- $(echo *.ext)
if [ "${#}" -gt 0 ];then
echo "got file"
fi
Это неверно. Во-первых, вы, вероятно, подразумевали '-ge' вместо' -gt', потому что иначе ваш код не будет обнаруживать один файл. Во-вторых, если нет файлов, соответствующих шаблону, любая соответствующая оболочка оставит строку '* .ext' нетронутой, так что вы все равно получите один« результат ». –
$ # - 1 для одного файла и 0 без файлов. – frayser
Баш только:
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
настройки) ,
shopt -s nullglob
if [[ -n $(echo *.flac) ]] # or [ -n "$(echo *.flac)" ]
then
echo true
fi
Это использует ls (1), если не существует файлов flac, ls сообщает об ошибке, и сценарий завершается; othewise сценарий продолжается, и файлы могут быть обработаны
#! /bin/sh
ls *.flac >/dev/null || exit
## Do something with flac files here
Для дополнительной тишины переадресовывайте 2> и 1. – Jasper
Версия if: 'if ls * .flac>/dev/null 2> & 1; затем ... fi; ' –
Верхнее решение (if [ -e *.flac ];)
не работал для меня, давая: [: too many arguments
if ls *.flac >/dev/null 2>&1;
, то он будет работать.
Это решение без внешних команд (т. Е. No ls
), но вместо этого используется функция оболочки. Испытано в Баш:
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
.
Вы можете использовать -f, чтобы проверить, существуют ли файлы определенного типа:
#!/bin/bash
if [ -f *.flac ] ; then
echo true
fi
Почему вы не должны разбирать выходные данные ls http://mywiki.wooledge.org/ParsingLs –
Эй, Томас, как насчет добавления лучшего решения вопроса вместо просто вниз. – JeremyWeir
Томас, ваш пример того, почему не использовать его, используется 'ls -l', мой ответ использует' ls -1' – JeremyWeir