Проверьте, существует ли в каталоге определенный тип файла/расширение

Как бы вы рассказывали, существуют ли файлы определенного расширения в каталоге, bash?

Что-то вроде

if [ -e *.flac ]; then 
echo true; 
fi 

Ответ 1

#!/bin/bash

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

Ответ 2

#/bin/bash

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

Вам нужно быть аккуратным, какой флаг вы вводите в свой оператор 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.

Ответ 6

#!/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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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).

Ответ 10

Вот решение, не использующее внешних команд (т.е. 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.