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

Bash проверка наличия папки

Я пытаюсь создать Bash script, который удалит все в моем каталоге .waste. У меня есть базовый script, который я написал, но я хочу, чтобы он сначала проверял, имеет ли каталог .waste содержимое, и если да, то выдается простое сообщение "Folder already empty!". Я не слишком разбираюсь в операторах if и if else, и я не знаю, что нужно для проверки наличия [ ].

Основной код:

#! /bin/bash
echo "The files have been deleted:"
cd /home/user/bin/.waste/
ls
rm -rf /home/user/bin/.waste/*

(P.S. не уверен, что звездочка верна в конце, я попробовал script с ней, и я помню, что она удалила все в директории bin)

4b9b3361

Ответ 1

Вы можете проверить, пуст ли каталог такой:

#!/bin/sh
target=$1
test "$(ls -A "$target" 2>/dev/null)" || echo The directory $target is empty

Или еще лучше:

#!/bin/sh
target=$1
if test "$(ls -A "$target")"; then
    echo not empty, do something
else
    echo The directory $target is empty '(or non-existent)'
fi

UPDATE

Если каталог содержит много файлов, это может быть медленным. В этом случае это должно быть быстрее:

#!/bin/sh
target=$1
if find "$target" -mindepth 1 -print -quit | grep -q .; then
    echo not empty, do something
else
    echo The directory $target is empty '(or non-existent)'
fi

Команда find будет печатать и завершать работу после того, как найдет первый файл или каталог внутри $target. grep -q . с успехом выйдет, только если find напечатал что угодно, другими словами, если бы были какие-либо файлы.

Ответ 2

Поиск GNU позволит вам сделать это

find . -maxdepth 0 -empty -exec echo {} is empty. \;

довольно быстро и без труб

Ответ 3

Извините, у меня недостаточно ответов, чтобы ответить на комментарий Dominik с комментарием, так что это лучшее, что я могу сделать...

Моя находка в Solaris не имеет опции maxdepth... как я могу добиться того же? - Доминик 14 ноября в 12:46

Я не могу сказать наверняка в более ранних версиях, но на Solaris 10 или выше:

find . ! -name . -prune