- Как проверить, существует ли файл или каталог в Bash
- Проверьте, существует ли файл
- Проверить, существует ли каталог
- Проверьте, не существует ли файла
- Проверьте, существует ли несколько файлов
- Операторы проверки файлов
- Выводы
- bash. Kak проверить наличие в каталоге определенных файлов.
- Re: bash. Kak проверить наличие в каталоге определенных файлов.
- Re: bash. Kak проверить наличие в каталоге определенных файлов.
- Re: bash. Kak проверить наличие в каталоге определенных файлов.
- Re: bash. Kak проверить наличие в каталоге определенных файлов.
- Re: bash. Kak проверить наличие в каталоге определенных файлов.
- Re: bash. Kak проверить наличие в каталоге определенных файлов.
- Re: bash. Kak проверить наличие в каталоге определенных файлов.
- Re: bash. Kak проверить наличие в каталоге определенных файлов.
- Re: bash. Kak проверить наличие в каталоге определенных файлов.
- Re: bash. Kak проверить наличие в каталоге определенных файлов.
- Как проверить, существует ли файл или каталог в Bash
- How to Check if a File or Directory Exists in Bash
- В Bash вы можете использовать тестовую команду, чтобы проверить, существует ли файл и определить тип файла.
- Проверьте, существует ли файл
- Проверьте, существует ли каталог
- Проверьте, не существует ли файл
- Проверьте, существует ли несколько файлов
- Операторы проверки файлов
- Вывод
- Блог системного администратора Windows/Linux/FreeBSD
- Shell-скрипт с условием проверки наличия файла для Linux/FreeBSD
- Похожие записи:
- Shell-скрипт с условием проверки наличия файла для Linux/FreeBSD : 8 комментариев
Как проверить, существует ли файл или каталог в Bash
Часто при написании сценариев оболочки вы можете оказаться в ситуации, когда вам нужно выполнить действие в зависимости от того, существует файл или нет.
В Bash вы можете использовать команду test, чтобы проверить, существует ли файл, и определить тип файла.
Команда test принимает одну из следующих синтаксических форм:
Если вы хотите, чтобы ваш сценарий был переносимым, вам следует предпочесть старую команду test [ , которая доступна во всех оболочках POSIX. Новая обновленная версия тестовой команды [[ (двойные скобки) поддерживается в большинстве современных систем, использующих Bash, Zsh и Ksh в качестве оболочки по умолчанию.
Проверьте, существует ли файл
При проверке существования файла наиболее часто используются операторы FILE -e и -f . Первый проверит, существует ли файл независимо от типа, а второй вернет истину, только если ФАЙЛ является обычным файлом (а не каталогом или устройством).
Наиболее удобочитаемый вариант при проверке существования файла — использование команды test в сочетании с оператором if . Любой из приведенных ниже фрагментов проверит, существует ли файл /etc/resolv.conf :
Если вы хотите выполнить другое действие в зависимости от того, существует файл или нет, просто используйте конструкцию if / then:
Вы также можете использовать команду test без оператора if. Команда после оператора && будет выполнена только в том случае, если статус выхода тестовой команды — истина,
Если вы хотите запустить серию команд после оператора && просто заключите команды в фигурные скобки, разделенные ; или && :
Напротив && , оператор после || Оператор будет выполняться только в том случае, если статус выхода тестовой команды false .
Проверить, существует ли каталог
Операторы -d позволяют вам проверить, является ли файл каталогом или нет.
Например, чтобы проверить, существует ли каталог /etc/docker вы должны использовать:
Вы также можете использовать двойные скобки [[ вместо одинарной [ .
Проверьте, не существует ли файла
Как и во многих других языках, тестовое выражение может быть отменено с помощью ! (восклицательный знак) оператор логического НЕ:
То же, что и выше:
Проверьте, существует ли несколько файлов
Вместо использования сложных вложенных конструкций if / else вы можете использовать -a (или && с [[ ), чтобы проверить, существует ли несколько файлов:
Эквивалентные варианты без использования оператора IF:
Операторы проверки файлов
Команда test включает в себя следующие операторы FILE, которые позволяют проверять файлы определенных типов:
- -b FILE — Истина, если ФАЙЛ существует и является специальным блочным файлом.
- -c FILE — Истина, если ФАЙЛ существует и является файлом специальных символов.
- -d FILE — Истина, если ФАЙЛ существует и является каталогом.
- -e FILE — Истина, если ФАЙЛ существует и является файлом, независимо от типа (узел, каталог, сокет и т. д.).
- -f FILE — Истина, если ФАЙЛ существует и является обычным файлом (не каталогом или устройством).
- -G FILE — Истина, если ФАЙЛ существует и имеет ту же группу, что и пользователь, выполняющий команду.
- -h FILE — Истина, если ФАЙЛ существует и является символической ссылкой.
- -g FILE — Истина, если ФАЙЛ существует и для него установлен флаг set-group-id ( sgid ).
- -k FILE — Истина, если ФАЙЛ существует и для него установлен флаг липкого бита.
- -L FILE — Истина, если ФАЙЛ существует и является символической ссылкой.
- -O FILE — Истина, если ФАЙЛ существует и принадлежит пользователю, выполняющему команду.
- -p FILE — Истина, если ФАЙЛ существует и является каналом.
- -r FILE — Истинно, если ФАЙЛ существует и доступен для чтения.
- -S FILE — Истина, если ФАЙЛ существует и является сокетом.
- -s FILE — Истина, если ФАЙЛ существует и имеет ненулевой размер.
- -u FILE — Истинно, если ФАЙЛ существует и установлен флаг set-user-id ( suid ).
- -w FILE — Истина, если ФАЙЛ существует и доступен для записи.
- -x FILE — Истина, если ФАЙЛ существует и является исполняемым.
Выводы
В этом руководстве мы показали вам, как проверить, существует ли файл или каталог в Bash.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
Источник
bash. Kak проверить наличие в каталоге определенных файлов.
Требуется в скрипте проверять наличие в каталоге определенных файлов. Т.е. если в каталоге появились например файлы *.mp3, то перекодировать их в ogg и перемещать в каталог с музыкой. Если файлов нет, то просто завершать работу. Как более просто решить эту задачу.
В bash я не силен — натолкните на путь истинный. Я предполагаю засунуть в cron скрипт который будет периодически выполнять эту работу.
p.s. сейчас сделано так
for name in *.mp3
do mp32ogg —delete $name
Как еще это можно сделать? интересуют разные способы.
Re: bash. Kak проверить наличие в каталоге определенных файлов.
Re: bash. Kak проверить наличие в каталоге определенных файлов.
А зачем что-то усложнять? Единственное замечание — mp32ogg —delete «$name»
Чтобы файлы с пробелами корректно перекодировались.
Re: bash. Kak проверить наличие в каталоге определенных файлов.
Спасибо. пробовал вчера также конструкцию [ -f /path/*.mp3 ] но скорее всего под вечер накосячил, ибо у меня не работало так как я хотел.
по поводу замечания — «$name» — спасибо — учту.
Re: bash. Kak проверить наличие в каталоге определенных файлов.
Я правильно понимаю, что [ ххххх ] это сокращение от test ххххх ??
Re: bash. Kak проверить наличие в каталоге определенных файлов.
Re: bash. Kak проверить наличие в каталоге определенных файлов.
find /where/to -type f -name «*.mp3» -exec mp32ogg —delete «<>» \;
Re: bash. Kak проверить наличие в каталоге определенных файлов.
а какой смысл перекодировать mp3 в ogg? греться у компа холодними зимними вечерами?
Re: bash. Kak проверить наличие в каталоге определенных файлов.
>а какой смысл перекодировать mp3 в ogg? греться у компа холодними зимними вечерами?
За _свободу_ до конца!
Re: bash. Kak проверить наличие в каталоге определенных файлов.
смысл сейчас объясню. Перекодированные файлы добавляются в плейлист ices и далее вещание в локальную сеть через icecast. Поэтому ухудшение качества меня не сильно беспокоит.
Re: bash. Kak проверить наличие в каталоге определенных файлов.
Так. хочу внести некоторые усовершенствования в скрипт. Он у меня сейчас запускается по cron-у один раз в 15 минут, так как машина очень слабая P-MMX, перекодирование идет медленно, и если закинуть в каталог сразу много файлов я предполагаю возникнет следующая ситуация: файлы еще до конца не перекодировались и не удалились из каталога, а скрипт запущен еще раз, что приведет в конечном счете к зависону.
Хочу ввести еще одну проверку. Т.е. мне надо определить закончил ли работу скрипт (идет ли в данный момент перекодирование mp3 в ogg), и в случае если перекодировка еще не закончена, завершить работу скрипта.
Каким образом это организовать? Наверное можно анализировать
ps -A | grep mp32ogg
Как сделать такую проверку? Если можно — разные варианты, т.к. как я уже писал выше в bash я не особенно силен и хочу посмотреть различные пути решения.
Источник
Как проверить, существует ли файл или каталог в Bash
How to Check if a File or Directory Exists in Bash
В Bash вы можете использовать тестовую команду, чтобы проверить, существует ли файл и определить тип файла.
Во многих случаях при написании сценариев Shell вы можете оказаться в ситуации, когда вам нужно выполнить действие, основанное на том, существует файл или нет.
Команда test принимает одну из следующих синтаксических форм:
Если вы хотите, чтобы ваш скрипт был переносимым, вам следует использовать старую [ команду test , которая доступна во всех оболочках POSIX. Новая обновленная версия команды test [[ (двойные скобки) поддерживается в большинстве современных систем, использующих Bash, Zsh и Ksh в качестве оболочки по умолчанию.
Проверьте, существует ли файл
При проверке существования файла чаще всего используются операторы FILE -e и -f . Первый проверит, существует ли файл независимо от его типа, а второй вернет истину, только если ФАЙЛ является обычным файлом (не каталогом или устройством).
Наиболее читаемым вариантом при проверке существования файла является использование test команды в сочетании с if оператором . Любой из фрагментов ниже проверит, /etc/resolv.conf существует ли файл:
Вы также можете использовать команду test без оператора if. Команда после && оператора будет выполнена только в том случае, если статус выхода тестовой команды равен true,
Напротив && , оператор после || оператора будет выполняться только в том случае, если статус выхода команды test равен false .
Проверьте, существует ли каталог
Операторы -d позволяют проверить, является ли файл каталогом или нет.
Например, чтобы проверить, /etc/docker существует ли каталог, вы должны использовать:
Вы также можете использовать двойные скобки [[ вместо одной [ .
Проверьте, не существует ли файл
Как и во многих других языках, тестовое выражение можно отменить, используя ! логический оператор not (восклицательный знак):
То же, что и выше:
Проверьте, существует ли несколько файлов
Вместо использования сложных вложенных конструкций if / else вы можете использовать -a (или && с [[ ), чтобы проверить, существует ли несколько файлов:
Операторы проверки файлов
Команда test включает в себя следующие операторы FILE, которые позволяют вам тестировать определенные типы файлов:
- -b FILE — Истина, если ФАЙЛ существует и является специальным файлом блока.
- -c FILE — Истина, если ФАЙЛ существует и является файлом специальных символов.
- -d FILE — Истина, если ФАЙЛ существует и является каталогом.
- -e FILE — Истина, если ФАЙЛ существует и является файлом, независимо от его типа (узел, каталог, сокет и т. Д.).
- -f FILE — Истина, если ФАЙЛ существует и является обычным файлом (не каталогом или устройством).
- -G FILE — Истина, если ФАЙЛ существует и имеет ту же группу, что и пользователь, выполняющий команду.
- -h FILE — Истина, если ФАЙЛ существует и является символической ссылкой.
- -g FILE — Истина, если ФАЙЛ существует и установлен sgid флаг set -group-id ( ).
- -k FILE — Истина, если ФАЙЛ существует и установлен флаг закрепления битов.
- -L FILE — Истина, если ФАЙЛ существует и является символической ссылкой.
- -O FILE — Истина, если ФАЙЛ существует и принадлежит пользователю, выполняющему команду.
- -p FILE — Истина, если ФАЙЛ существует и является каналом.
- -r FILE — Истина, если ФАЙЛ существует и доступен для чтения.
- -S FILE — Истина, если ФАЙЛ существует и является сокетом.
- -s FILE — Истина, если ФАЙЛ существует и имеет ненулевой размер.
- -u FILE — Истина, если ФАЙЛ существует и установлен suid флаг set-user-id ( ).
- -w FILE — Истина, если ФАЙЛ существует и доступен для записи.
- -x FILE — Истина, если ФАЙЛ существует и является исполняемым.
Вывод
В этом руководстве мы показали, как проверить, существует ли файл или каталог в Bash.
Источник
Блог системного администратора Windows/Linux/FreeBSD
Shell-скрипт с условием проверки наличия файла для Linux/FreeBSD
Представлю вам скрипт, который архивирует файл, если он есть в заданной директории. Если файла нет — архив не создается.
Остальные ключи проверки файлов/каталогов:
Второй вариант bash-скрипта для проверки условия существования файлов и их архивирования при наличии:
Третий вариант проверки условия существования любых файлов в каталоге:
#Задаем переменную директории
DIR=/000/test/test
#вычисляем количество файлов, которые есть в заданной директории
filecount=`find $DIR -type f | wc -l`
#если количество файлов равно нулю, то есть их нет, то выдается сообщение
if [ $filecount -eq 0 ];
then
echo «Файлов нет, выполняем скрипт дальше»
else
echo «Есть файлы, прекращаем работу скрипта» && exit
fi
Четвертый вариант проверки условия существования любых файлов в каталоге с бесконечным циклом:
while true
do
case `find $DIR -type f | wc -l` in
0 ) echo «no file» ;; #Если файлов нет — выводится сообщение (или можно подставить любой ваш скрипт или команду)
* ) sleep 5 ;; #если файлы в каталоге есть — ждем 5 секунд и дальше проверяем по-новому (к первому шагу)
esac
done
exit 0
Похожие записи:
Shell-скрипт с условием проверки наличия файла для Linux/FreeBSD : 8 комментариев
Подскажите, а как будет выглядеть скрипт, который не даст дальнейшее выполнение основного скрипта, пока в указанном каталоге присутствуют файлы (любые), с любым именем и расширением?
Алексей, я добавил в статью вариант под вашу нужду. Пойдет?
Третий вариант, я думаю тоже возьму на заметку, но
если можно покажите пример, в котором бы
был как я понимаю бесконечный цикл проверки на наличия файлов.
То есть почти как третий вариант, только если файлы есть, то работа скрипта не прекращалась вообще, а допустим был бы sleep 5 и после него проверка повторялась и так до тех пор пока каталог не будет пустым и только тогда пойдёт выполнение скрипта далее.
Четвертый вариант пойдет? Я проверил — работает так, как вам нужно, если я правильно понял.
То что надо!
Спасибо
Не могу понять, пишу это на роутере.
Под sh выполняется всё корректно find $DIR -type f | wc -l,
а когда сам роутер выполняет эту команду, то почему то
она всё время пишет ноль файлов в каталоге, хотя они там есть.
Если быть точнее, то пишу скрипт:
filecount=`find /opt/var/spool/sms/failed/ -type f | wc -l`
echo -e $filecount >> /tmp/status
если данный скрипт выполнить под ssh, то всё ок, а если
его выполняет cron, то всё время получаю ноль.
Вроде разобрался, указал до команды find полный путь.
Источник