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
)
Ответы
Ответ 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