Как проверить, является ли папка пустой или файл папки использует shell-скрипт? - PullRequest
11 голосов
/ 23 ноября 2010

У меня есть вопрос

я пробую какую-то функцию, например

DIR = / путь / TMP /

if [-d "$ DIR"]; тогда

и

if [-f "$ DIR"]; тогда

но только проверять / path / tmp этот путь

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

Ответы [ 7 ]

18 голосов
/ 23 ноября 2010

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

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

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

Примечание

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

16 голосов
/ 23 ноября 2010

Для этого можно использовать ls -A:

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

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

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

1 голос
/ 07 марта 2017
[ -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
1 голос
/ 23 ноября 2010

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

if $(ls -v $DIR)
0 голосов
/ 12 октября 2015

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

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
0 голосов
/ 24 апреля 2015

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

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
0 голосов
/ 23 ноября 2010

rmdir "$DIR"

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...