Мне нужно проверить, пуста ли папка или нет, и в соответствии с выводом мне нужно выполнить некоторые другие команды. Я работаю на Ubuntu 18.04.5 LTS.
Мой bash-скрипт:
if [ "$(ls -A /mnt/mamdrive/"As Metadata"/)" ] || ["$(ls -A /mnt/mamdrive/"As Video"/)" ]; then
echo "copy file"
else
echo "dont copy"
fi
Условие иногда работает, но иногда нет, и его трудно воспроизвести. Есть ли другой способ проверить, пуст ли каталог, и выполнить какие-то действия соответствующим образом?
решение1
Я бы предложил что-то, что не полагается на вывод строки ls
, например, проверку того, есть ли какие-либо результаты расширения глобуса:
#!/bin/bash
shopt -s nullglob # don't return literal glob if matching fails
shopt -s dotglob # make * match "almost all" like ls -A
set -- /mnt/mamdrive/"As Metadata"/*
if (( $# > 0 )); then
echo "not empty"
else
echo "empty"
fi
Если вы хотите проверить, являются ли два каталога пустыми, вы можете просто выполнить глобальную операцию для обоих каталогов:
set -- /mnt/mamdrive/"As Metadata"/* /mnt/mamdrive/"As Video"/*
решение2
Самый простой способ — использовать ls -A
в if
таком утверждении:
path=$(ls -A '/whatever/sub directory/more spaces')
if [[ ! -z "$path" ]]; then
echo "Directory is NOT empty!"
else
echo "Directory is empty!"
fi
решение3
find
в сочетании с ifne
может работать как копирование в пустоту:
$ find test/ -maxdepth 0 -empty | ifne cp -t test/ a
Использование его в операторе if может выглядеть примерно так:
#!/bin/bash
if find test/ -maxdepth 0 ! -empty | ifne false; then
echo Directory is empty
else
echo Directory is not empty
fi
решение4
Поскольку ls
хорошо известно, что парсинг подвержен ошибкам, поскольку изначально не был предназначен для парсинга, следует отдать предпочтение другим решениям. В дополнение к ответу @steeldriver, это также можно сделать с помощью find
:
if [[ "$(find '/mnt/mamdrive/As Metadata' '/mnt/mamdrive/As Video' -maxdepth 1 -mindepth 1 2>/dev/null)" ]]
then
echo “copy file”
else
echo "don't copy"
fi
maxdepth
и mindepth
параметры используются здесь только для печати и сканирования прямых потомков указанных каталогов. Перенаправление гарантирует, что сообщения об ошибках не будут выводиться, если некоторые аргументы отсутствуют.
Добавление нескольких каталогов будет работать как ИЛИ, поэтому "копировать файл" будет напечатано, если хотя бы один из протестированных каталогов непустой. Использование find
также позволяет выполнять более тонкую настройку с использованием аргументов, таких как имена файлов, типы файлов и многое другое.