2013-09-13 4 views
0

Я новичок в языке сценариев командной оболочки, у меня есть этот скрипт:Поиск конкретных файлов расширения (shellscript)

#!/bin/bash 

path_file_conf=/fullpath/directory/*.conf 
if [ -e "$path_file_conf" ];then 
    echo "Found file" 
else 
    echo "No found file" 
fi 

Результат не всегда «Не найдено ни одного файла», даже если у меня есть .conf файлы внутри/FULLPATH/directory/folder.

Могу ли я узнать, какая часть кода является неправильной? Спасибо заранее!

ответ

1

линия вызывает проблемы является:

path_file_conf=/full/path/directory/*.conf 

Оболочка не делает расширение джокера по имени, когда есть несколько файлов, чтобы соответствовать, или если файлы не совпадают, так что (за исключением необычных обстоятельствах иметь файл под названием *.conf со звездочкой) тест -e не прошел. Вероятно, есть опция в bash, чтобы генерировать ошибку, когда wild card не соответствует; Я бы никогда не использовал его.

Вы можете использовать:

path_file_conf=(/full/path/directory/*.conf) 

Это дает массив с именами файлов в качестве элементов массива. Однако, если нет файлов, которые соответствуют друг другу, это дает вам имя, записанное как единственный элемент массива.

Оттуда вы можете проверить каждый файл, в свою очередь:

for conf_file in "${path_file_conf[@]}" 
do 
    if [ -e "$conf_file" ] 
    then echo "Found file $conf_file" 
    else echo "No such file as $conf_file" 
    fi 
done 

Вы можете определить количество имен с ${#path_file_conf[@]}, но помните, что 1 может указывать на реальный файл или несуществующий файл.

+0

эта логика работает. Спасибо за вашу помощь. – Paengski

2

Выражение:

path_file_conf=/fullpath/directory/*.conf 

Может иметь несколько имен путей, которые соответствуют. Таким образом, значение $path_file_conf может в конечном итоге, к примеру:

/fullpath/directory/foo1.conf /fullpath/directory/foo2.conf 

Условный:

if [ -e "$path_file_conf" ]; then 

Проверка существования одного файла. Если «/fullpath/directory/foo1.conf /fullpath/directory/foo2.conf» не называет «один файл», чего не будет, тогда условие не удастся, даже если файлы существуют.

Вы можете проверить этот способ. Если путь не будет расширяться, он завершится с ошибкой и завершится. Если он найдет хотя бы один хороший путь, он добьется успеха и уйдет.

for pf in $path_file_conf ; do 
    if [ -e "$pf" ] ; then 
    echo "Found" 
    break 
    else 
    echo "Not found" 
    fi 
done 
+0

Эта логика работает. Спасибо за помощь. – Paengski

2

Я хотел бы попробовать что-то вроде этого:

for filename in /fullpath/directory/*.conf 
do 
    if [ -e "$filename" ] # If finds match... 
    then 
     echo "Found file" 
     echo 
    else 
     echo "No found file" 

    fi 
done 

Я не проверял, так что я не уверен, что это работает, но это, по крайней мере, дать вам общую стратегию.

+0

эта логика работает. Спасибо за помощь. – Paengski

Смежные вопросы