Проверьте, существует ли определенный тип файла / расширение в каталоге - PullRequest
60 голосов
/ 04 октября 2010

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

Что-то вроде

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

Ответы [ 13 ]

75 голосов
/ 04 октября 2010
#!/bin/bash

count=`ls -1 *.flac 2>/dev/null | wc -l`
if [ $count != 0 ]
then 
echo true
fi 
16 голосов
/ 04 октября 2010
#/bin/bash

myarray=(`find ./ -maxdepth 1 -name "*.py"`)
if [ ${#myarray[@]} -gt 0 ]; then 
    echo true 
else 
    echo false
fi
13 голосов
/ 05 октября 2010

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

#! /bin/sh
ls *.flac  >/dev/null || exit
## Do something with flac files here
7 голосов
/ 04 октября 2010
shopt -s nullglob
if [[ -n $(echo *.flac) ]]    # or [ -n "$(echo *.flac)" ]
then 
    echo true
fi
3 голосов
/ 05 ноября 2015

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

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

3 голосов
/ 04 октября 2010
#!/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
2 голосов
/ 04 октября 2010
   shopt -s nullglob
   set -- $(echo *.ext)
    if [ "${#}" -gt 0 ];then
      echo "got file"
    fi
2 голосов
/ 04 октября 2010

Вы должны быть осторожны, какой флаг вы выбрасываете в свой оператор if, и как он соотносится с желаемым результатом.

Если вы хотите проверить только обычные файлы , а не другие типы записей файловой системы, вам нужно изменить код вашего скелета на:

if [ -f file ]; then
echo true;
fi

Использование -f ограничивает if обычными файлами, тогда как -e более обширный и будет соответствовать всем типам записей файловой системы. Конечно, есть и другие опции, такие как -d для каталогов и т. Д. См. http://tldp.org/LDP/abs/html/fto.html для хорошего списка.

Как указывает @msw, test (то есть [) будет задыхаться, если вы попытаетесь передать ему более одного аргумента. Это может произойти в вашем случае, если глобус для *.flac вернул более одного файла. В этом случае попробуйте обернуть ваш if тест в цикл вроде:

for file in ./*.pdf
do
    if [ -f "${file}" ]; then
    echo 'true';
    break
    fi
done

Таким образом, вы break в первом экземпляре нужного расширения файла можете продолжать работу с остальной частью сценария.

1 голос
/ 20 февраля 2018

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

#!/bin/bash

if [ -f *.flac ] ; then
   echo true
fi 
1 голос
/ 01 февраля 2017

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...