Подтвердить что ты не робот

Как проверить, что папка пуста или файл папки используется shell- script?

У меня вопрос

Я пытаюсь выполнить некоторую функцию, например

DIR =/путь/TMP/

если [-d "$ DIR" ]; то

и

если [-f "$ DIR" ]; то

но только check/path/tmp этот путь

как я могу это сделать?

4b9b3361

Ответ 1

Вы можете использовать ls -A для этого:

if [ "$(ls -A "$DIR" 2> /dev/null)" == "" ]; then
    # The directory is empty
fi

-A показывает все скрытые файлы и каталоги, за исключением . и .., которые всегда есть, поэтому он будет пустым в пустом каталоге и не пустым в каталоге с любыми файлами или подкаталогами.

2> /dev/null отбрасывает любые сообщения об ошибках ls может печатать (обратите внимание, что проверка несуществующего каталога приведет к ложному срабатыванию, но вы сказали, что уже проверили, что он существует). Проверка каталога, в котором у вас нет доступа на чтение, также дает ложный результат.

Ответ 2

Из Bash FAQ # 4 - Как проверить, пуст ли каталог или нет?

shopt -s nullglob dotglob
files=(*)
(( ${#files[*]} )) || echo directory is empty
shopt -u nullglob dotglob

Этот небольшой script заполняет массив files каждым файлом, найденным в расширении пути *. Затем он проверяет размер массива и, если он 0, он печатает "каталог пуст". Это будет работать со скрытыми файлами благодаря использованию dotglob.

Примечание

Ответы, которые просят разобрать ls, как правило, плохая идея и плохая форма. Чтобы понять, почему, прочитайте Почему вы не должны анализировать вывод ls

Ответ 3

[ -z "$(find "$DIR" -maxdepth 0 -empty)" ] || echo "$DIR is empty!"

find имеет предикат -empty, который проверяет, является ли каталог или файл пустым, поэтому он будет перечислять каталог только в том случае, если он пуст. -z проверяет, является ли вывод find пустым. Если это так, то каталог содержит записи, если он не является пустым.

В других кодовых словах:

[ -n "$(find "$DIR" -maxdepth 0 -empty)" ] && echo "$DIR is empty!"

Еще один приятный вариант:

if ! ls -AU "$DIR" | read _; then
    echo "$DIR is empty!"
fi

Ответ 4

Почему бы не использовать ls -v? поэтому будет распечатываться пустым, если нет файла, такого как

if $(ls -v $DIR)

Ответ 5

rmdir "$DIR"

Если $? равно 1, каталог не пуст. Если 0, оно пустое и оно удаляется.

Вы можете воссоздать его, если вы не собираетесь его удалять: mkdir "$DIR"

Ответ 6

Это говорит мне, что каталог пуст или нет, количество файлов, которое оно содержит.

directory="/path/tmp"
number_of_files=$(ls -A $directory | wc -l)

if [ "$number_of_files" == "0" ]; then
    echo "directory $directory is empty"
else
    echo "directory $directory contains $number_of_files files"
fi

Ответ 7

Для этого используйте только встроенные оболочки (он должен работать для всех оболочек, с которыми я работал):

if test "`echo /tmp/testdir/* /tmp/testdir/.?*`" = \
    "/tmp/testdir/* /tmp/testdir/.."; then
  [...]
fi

Мы не проверяем /tmp/testdir/.*, потому что это будет расширяться до /tmp/testdir/./tmp/testdir/.. для пустой папки.

Другой вариант:

for i in /tmp/testdir/* /tmp/testdir/.?*; do
    test -e $i || break
    [...]
    break
done