2010-10-04 2 views

ответ

58
#!/bin/bash 

count=`ls -1 *.flac 2>/dev/null | wc -l` 
if [ $count != 0 ] 
then 
echo true 
fi 
+0

Почему вы не должны разбирать выходные данные ls http://mywiki.wooledge.org/ParsingLs –

+3

Эй, Томас, как насчет добавления лучшего решения вопроса вместо просто вниз. – JeremyWeir

+3

Томас, ваш пример того, почему не использовать его, используется 'ls -l', мой ответ использует' ls -1' – JeremyWeir

2

Вы должны быть 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 на первый экземпляр расширения файла, который вы хотите и можете продолжать идти с остальной частью сценария.

+1

за исключением 'test' (так называемый' [ ') жалуется, если шаблон расширяется более чем один файл:«ожидается бинарный оператор "или" слишком много аргументов " – msw

+1

@msw - спасибо, я даже не думал об этой проблеме. Я попытался изменить свой ответ, чтобы принять его во внимание. – dtlussier

+0

Вы должны указать переменную, т. Е. Использовать '' $ file "', потому что имя файла может содержать некоторые плохие символы, такие как пробелы или звездочки. –

2
#!/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 
10
#/bin/bash 

myarray=(`find ./ -maxdepth 1 -name "*.py"`) 
if [ ${#myarray[@]} -gt 0 ]; then 
    echo true 
else 
    echo false 
fi 
+4

Это хорошо, потому что вы можете на самом деле * сделать что-то с файлами после их поиска. – ephsmith

+0

+1 для обертывания подголовника, находящегося в скобках, чтобы myarray использовать переменную массива. В противном случае, если find не возвращает результат '$ {# myarray [@]}' равно 1 – shaffooo

2
shopt -s nullglob 
    set -- $(echo *.ext) 
    if [ "${#}" -gt 0 ];then 
     echo "got file" 
    fi 
+0

Это неверно. Во-первых, вы, вероятно, подразумевали '-ge' вместо' -gt', потому что иначе ваш код не будет обнаруживать один файл. Во-вторых, если нет файлов, соответствующих шаблону, любая соответствующая оболочка оставит строку '* .ext' нетронутой, так что вы все равно получите один« результат ». –

+0

$ # - 1 для одного файла и 0 без файлов. – frayser

1

Баш только:

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 настройки) ,

7
shopt -s nullglob 
if [[ -n $(echo *.flac) ]] # or [ -n "$(echo *.flac)" ] 
then 
    echo true 
fi 
8

Это использует ls (1), если не существует файлов flac, ls сообщает об ошибке, и сценарий завершается; othewise сценарий продолжается, и файлы могут быть обработаны

#! /bin/sh 
ls *.flac >/dev/null || exit 
## Do something with flac files here 
+2

Для дополнительной тишины переадресовывайте 2> и 1. – Jasper

+1

Версия if: 'if ls * .flac>/dev/null 2> & 1; затем ... fi; ' –

2

Верхнее решение (if [ -e *.flac ];) не работал для меня, давая: [: too many arguments

if ls *.flac >/dev/null 2>&1;, то он будет работать.

0

Это решение без внешних команд (т. Е. 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.

0

Вы можете использовать -f, чтобы проверить, существуют ли файлы определенного типа:

#!/bin/bash 

if [ -f *.flac ] ; then 
    echo true 
fi 
Смежные вопросы