Как проверить, пуста ли папка, и использовать ее содержимое в операторе if-then-else?

Как проверить, пуста ли папка, и использовать ее содержимое в операторе if-then-else?

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

Связанный контент