Как проверить, если каталог пуст с помощью find - PullRequest
0 голосов
/ 27 июля 2011

Я пытаюсь написать оператор if в сценарии оболочки Unix, который возвращает значение true, если оно пустое, и значение false, если это не так.

Этот тип вещи ...

if directory foo is empty then
echo empty
else
echo not empty
fi

Как мне это сделать? Мне сказали, что найти хорошее начало

Ответы [ 7 ]

4 голосов
/ 27 июля 2011

Простой - используйте флаг -empty.Цитирование страницы поиска:

 -empty  True if the current file or directory is empty.

Итак, что-то вроде:

find . -type d -empty

Перечислит все пустые каталоги.

2 голосов
/ 27 июля 2011

Должен быть более простой способ, но вы можете проверить наличие пустого / непустого каталога с ls -1A, переданным по каналу wc -l

DIRCOUNT=$(ls -1A /path/to/dir |wc -l)
if [ $DIRCOUNT -eq 0 ]; then
  # it's empty
fi
1 голос
/ 28 июля 2013

Три лучших ответа:

  1. Первый основан на find как запрашиваемый OP;
  2. Второй основан на ls;
  3. Третий - 100% bash, но он вызывает (порождает) суб-оболочку.

1.[ $(find your/dir -prune -empty) = your/dir ]

dn=your/dir
if [ x$(find "$dn" -prune -empty) = x"$dn" ]; then
  echo empty
else
  echo not empty
fi

test:

> mkdir -v empty1 empty2 not_empty
mkdir: created directory 'empty1'
mkdir: created directory 'empty2'
mkdir: created directory 'not_empty'
> touch not_empty/file
> find empty1 empty2 not_empty -prune -empty
empty1
empty2

find напечатал только две пустые директории (empty1 и empty2).

Этот ответ выглядит как -maxdepth 0 -empty от Ариэль .Но этот ответ немного короче;)

2.[ $(ls -A your/directory) ]

if [ "$(ls -A your/dir)" ]; then
  echo not empty
else
  echo empty
fi

или

[ "$(ls -A your/dir)" ] && echo not empty || echo empty

Аналогично Michael Berkowski и gpojd ответов.Но здесь мы не требуем трубку до wc.См. Также Проверка Bash Shell, является ли каталог пустым от nixCraft (2007).

3.(( ${#files} ))

files=$(shopt -s nullglob dotglob; echo your/dir/*)
if (( ${#files} )); then 
  echo not empty
else 
  echo empty or does not exist
fi

Внимание: как написано в этом примере выше, нет разницы между пустым каталогом и несуществующим.

Этот последний ответ был вдохновлен Ответ Бруно де Фрейна и отличные комментарии от teambob .

1 голос
/ 27 июля 2011
find directoryname -maxdepth 0 -empty
0 голосов
/ 27 июля 2011

что-то вроде ниже

dircnt.sh:
-----------
#!/bin/sh

if [ `ls $1 2> /dev/null | wc -l` -gt 0 ]; then echo true; else echo false; fi

Использование

andreas@earl ~
$ mkdir asal

andreas@earl ~
$ sh dircnt.sh asal
false

andreas@earl ~
$ touch asal/1

andreas@earl ~
$ sh dircnt.sh asal
true
0 голосов
/ 27 июля 2011
if [ `find foo | wc -l` -eq 1 ]
then
    echo Empty
else
    echo Not empty
fi

foo - это имя каталога здесь.

0 голосов
/ 27 июля 2011

Почему вы должны использовать find? В bash ls -a вернет два файла (. и ..) для пустого каталога и должно иметь больше, чем для непустых.

if [ $(ls -a | wc -l) -eq 2 ]; then echo "empty"; else echo "not empty"; fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...