Перевірка сценарію оболонки, чи каталог містить файли


116

Як із скрипту оболонки я можу перевірити, чи каталог містить файли?

Щось подібне до цього

if [ -e /some/dir/* ]; then echo "huzzah"; fi;

але це працює, якщо каталог містить один або декілька файлів (вищевказаний працює лише з точно 0 або 1 файлами).


Для того, що варто, щоб ваш приклад хороший, робить те, що ви хочете, в ksh і zsh
Дейв Вебб,

2
@DaveWebb Ні, це не так. Якщо глобус розширюється на більше ніж одне слово, zsh test повідомляє про "тест: занадто багато аргументів".
Єнс

"huzzah" означає "каталог не порожній".
funroll

Якщо каталог містить лише порожній підкаталог, чи вважається це "вмістом файлів"?
Кіт Томпсон

Відповіді:


72

Досі використовуються рішення ls. Ось все баш-рішення:

#!/bin/bash
shopt -s nullglob dotglob     # To include hidden files
files=(/some/dir/*)
if [ ${#files[@]} -gt 0 ]; then echo "huzzah"; fi

8
доки ви пам’ятаєте, щоб повернути параметри до початкового значення наприкінці сценарію :)
Жан

Це дещо вдосконалена версія, яка піклується про скидання налаштувань bash: shopt -q nullglob || resetnullglob=1; shopt -s nullglob; shopt -q dotglob || resetdotglob=1; shopt -s dotglob; files=(/some/dir/*); [ "$files" ] && echo "wowzers"; [ "$resetdotglob" ] && shopt -u dotglob; [ "$resetnullglob" ] && shopt -u nullglob;
user123444555621

12
Чому б не скористатися files=$(shopt -s nullglob;shopt -s dotglob;echo /some/dir/*)
допоміжною оболонкою

7
@teambob, якщо ви використовуєте підзагін: files=$(shopt -s nullglob;shopt -s dotglob;echo /some/dir/*) тоді оператор if повинен змінитися на if [ ${#files} -gt 0 ];або, можливо, ви просто забули () навколо команди підкошти? files=($(shopt -s nullglob;shopt -s dotglob;echo /some/dir/*))
stoutyhk

2
@stoutyhk $ (...) відновлює налаштування, окрема додаткова оболонка не потрібна. Використання $ (...) породжує новий екземпляр оболонки. Середовище цього нового екземпляра викидається, як тільки команда буде закінчена. Редагувати: Знайдено посилання tldp.org/LDP/abs/html/commandsub.html "Заміна команди викликає підзарядку."
teambob

139

Три найкращі трюки


shopt -s nullglob dotglob; f=your/dir/*; ((${#f}))

Цей трюк становить 100% bashі викликає (нереститься) підкожу. Ідея походить від Бруно Де Фрейне та вдосконалена коментарем колективу .

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

Примітка: різниці між порожнім каталогом і неіснуючим (і навіть тоді, коли передбачений шлях є файлом).

Існує аналогічна альтернатива та більше деталей (і більше прикладів) на "офіційному" поширеному питанні для #bash IRC каналу :

if (shopt -s nullglob dotglob; f=(*); ((${#f[@]})))
then
  echo "contains files"
else 
  echo "empty (or does not exist, or is a file)"
fi

[ -n "$(ls -A your/dir)" ]

Цей трюк натхненний статтею nixCraft, опублікованою в 2007 році. Додайте, 2>/dev/nullщоб придушити вихідну помилку "No such file or directory".
Дивіться також відповідь Ендрю Тейлора (2008) та відповідь gr8can8dian (2011).

if [ -n "$(ls -A your/dir 2>/dev/null)" ]
then
  echo "contains files (or is a file)"
else
  echo "empty (or does not exist)"
fi

або однолінійна версія башизму:

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

Примітка: ls повертається, $?=2коли каталог не існує. Але різниці між файлом і порожнім каталогом немає.


[ -n "$(find your/dir -prune -empty)" ]

Цей останній трюк натхненний відповіддю грастара, де -maxdepth 0замінюється -pruneта покращується коментарем Філса .

if [ -n "$(find your/dir -prune -empty 2>/dev/null)" ]
then
  echo "empty (directory or file)"
else
  echo "contains files (or does not exist)"
fi

варіація з використанням -type d:

if [ -n "$(find your/dir -prune -empty -type d 2>/dev/null)" ]
then
  echo "empty directory"
else
  echo "contains files (or does not exist or is not a directory)"
fi

Пояснення:

  • find -prune подібний, ніж find -maxdepth 0 використання менше символів
  • find -empty друкує порожні каталоги та файли
  • find -type d друкує лише каталоги

Примітка. Ви також можете замінити [ -n "$(find your/dir -prune -empty)" ]лише скорочену версію нижче:

if [ `find your/dir -prune -empty 2>/dev/null` ]
then
  echo "empty (directory or file)"
else
  echo "contains files (or does not exist)"
fi

Цей останній код працює в більшості випадків, але пам’ятайте, що шкідливі шляхи можуть виражати команду ...


2
Я думаю, ви можете спростити параметр пошуку до [ -n "$(find "your/dir" -prune -empty)" ], щоб уникнути повторення шляху до каталогу.
phils

Під час використання if [ ``ls -A your/dir`` ]в скрипті я прийшов до висновку, що він добре працює для каталогу з 0, 1 або 2 підкаталогами, але не працює для каталогу з більш ніж 2 підкаталогами. line 17: [: 20150424-002813: unary operator expectedде 20150424-002813було одне з імен каталогів. Використовувана оболонка була /bin/bash/. Нарешті я змінив це наls "$destination" | tail -1
Крістоф Де Троєр,

Привіт @ChristopheDeTroyer Я не можу відтворити вашу проблему. З мого боку if [ ``ls -A my/dir`` ]виходить з помилки bash: [: -A: binary operator expected. Випробуваний на баш-версіях 4.1.2 та 4.2.53.
олібре

1
Що ж, мене в основному мотивували коментарі через сприйняту невідповідність (оскільки -nваріант був у заголовку, але тоді не в абзаці нижче). Так, так, це добре.
maxschlepzig

1
Я використовую ваше -n рішення, все ще мій сценарій скаржиться на це ls: cannot access '/path': No such file or directory. Чи є спосіб я придушити це повідомлення? Я хотів би там промовчати мовчки.
Фредо

48

Як щодо наступного:

if find /some/dir/ -maxdepth 0 -empty | read v; then echo "Empty dir"; fi

Таким чином, немає необхідності генерувати повний перелік вмісту каталогу. Це readі те, щоб відкинути висновок і змусити вираз оцінити як істинне лише тоді, коли щось прочитане (тобто /some/dir/знайдене порожнім find).


3
або простоfind /some/dir/ -maxdepth 0 -empty -exec echo "huzzah" \;
подвійнеDown

5
+1 Це найелегантніше рішення. Він не передбачає розбору lsрезультатів і не покладається на функції оболонки, що не є типовими.

7
Однак він покладається на нестандартні -maxdepthта -emptyпервинні елементи.
чепнер

21

Спробуйте:

if [ ! -z `ls /some/dir/*` ]; then echo "huzzah"; fi

Це працювало для мене, але я не можу відформатувати це d * mn повідомлення !!! <br> експортувати tmp = /bin/ls <some_dir>/* 2> /dev/nullif [! -z "$ tmp"]; то відлуння Щось там є fi
AndrewStone

1
Для таких ідіотів Баша, як я, якщо ви хочете перевірити навпаки - чи каталог порожній - просто використовуйте, якщо [-z ls /some/dir/*]; потім відлуння "хуза"; fi
Кріс Москіні

4
Ви можете використовувати -nзамість ! -z(вони обидва еквівалентні, але чому б не використовувати більш коротку форму, коли вона існує).
n.st

ЗІ ЗШ цей приклад видає помилку, ідея полягає у тому, щоб помилка не була викинута ... BigGray% if [ ! -z ls / some / dir / * `]; потім відлуння "хуза"; fi zsh: матчів не знайдено: / some / dir / * `
Hvisage

не працює для мене без подвійних цитат ls...у bash
letmutx

15
# Works on hidden files, directories and regular files
### isEmpty()
# This function takes one parameter:
# $1 is the directory to check
# Echoes "huzzah" if the directory has files
function isEmpty(){
  if [ "$(ls -A $1)" ]; then
    echo "huzzah"
  else 
    echo "has no files"
  fi
}

15

Подбайте про каталоги з великою кількістю файлів! Оцінка команди може зайняти деякий час ls.

ІМО найкращим рішенням є те, що використовується

find /some/dir/ -maxdepth 0 -empty


6

Не могли б ви порівняти результат цього?

 ls -A /some/dir | wc -l

4
# Перевіряє, чи містить у каталозі будь-які не приховані файли.
#
# використання: якщо порожній "$ HOME"; потім відлуння "Ласкаво просимо додому"; фі
#
пусто() {
    для _ief в $ 1 / *; робити
        if [-e "$ _ief"]; тоді
            повернути 1
        фі
    зроблено
    повернути 0
}

Деякі примітки щодо впровадження:

  • forЦикл уникає виклик зовнішнього lsпроцесу. Він все ще зчитує всі записи каталогів один раз. Це можна оптимізувати лише шляхом написання програми C, яка явно використовує readdir ().
  • test -eВсередині циклу ловить випадок порожній каталог, в цьому випадку змінна _iefбуде присвоєно значення «somedir / *». Тільки за наявності цього файлу функція повернеться "непусто"
  • Ця функція буде працювати у всіх реалізаціях POSIX. Але майте на увазі, що Solaris / bin / sh не належить до цієї категорії. Її testреалізація не підтримує -eпрапор.

1
Якщо ігнорувати dotglobне буде встановлено shopt -s dotglob
точкових файлів

4

Це підказує мені, якщо каталог порожній, чи ні, кількість файлів, які він містить.

directory="/some/dir"
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

Хто-небудь може мені пояснити, чому мене зняли з посади? Якщо я пишу лайки, то я хотів би знати чому;)
Daishi

1
Я не спростовував цього, але, мабуть, це тому, що ти розбираєш результатls .
Toby Speight

чи пов'язана стаття незрозуміла? Якщо так, напишіть автору (не мені).
Toby Speight

1
@TobySpeight Я бачу сенс. Але в цьому випадку я рахую рядки, не перераховуючи їх. Це має дати помилковий результат, лише якщо ім'я файлу містить новий рядок. І якщо назви файлів містять нові рядки, десь набагато важливіше повинно бути десь f ** ked;)
Daishi

3

Це може бути дуже пізньою реакцією, але ось рішення, яке працює. Цей рядок розпізнає лише існування файлів! Це не дасть помилкового позитиву, якщо каталоги існують.

if find /path/to/check/* -maxdepth 0 -type f | read
  then echo "Files Exist"
fi

2
dir_is_empty() {
   [ "${1##*/}" = "*" ]
}

if dir_is_empty /some/dir/* ; then
   echo "huzzah"
fi

Припустимо , у вас немає файлу з ім'ям *в /any/dir/you/check, він повинен працювати на bash dash posh busybox shі zshа (для Zsh) потрібно unsetopt nomatch.

Вистави повинні бути порівнянні з будь- lsякими, які використовують *(глобус), я вважаю, що вони будуть повільними в каталогах з багатьма вузлами (мій /usr/binз 3000+ файлами пішов не так повільно), буде використовувати принаймні достатньо пам'яті, щоб виділити всі dirs / назви файлів (і більше) оскільки всі вони передані (вирішені) функції як аргументи, певна оболонка, ймовірно, має обмеження на кількість аргументів та / або тривалість аргументів.

Було б непогано мати портативний швидкий O (1) нульовий ресурс, щоб перевірити, чи каталог порожній.

оновлення

Наведена вище версія не враховує приховані файли / dirs, якщо потрібен ще якийсь тест, як, наприклад, трюкиis_empty від sh-фай (оболонки POSIX) Річа :

is_empty () (
cd "$1"
set -- .[!.]* ; test -f "$1" && return 1
set -- ..?* ; test -f "$1" && return 1
set -- * ; test -f "$1" && return 1
return 0 )

Але натомість я думаю про щось подібне:

dir_is_empty() {
    [ "$(find "$1" -name "?*" | dd bs=$((${#1}+3)) count=1 2>/dev/null)" = "$1" ]
}

Певне занепокоєння з приводу різниць косої риски від аргументу та виводу знаходження, коли реєстр порожній, і проходження нових рядків (але це має бути легко впоратися), на жаль, на моєму busybox shпоказі, що, ймовірно, помилка на find -> ddтрубі з вихідним скороченням випадковим чином ( якщо я використовував catвихід завжди однаковий, схоже, ddз аргументом count).


Я люблю портативне рішення. Я прийшов, щоб дати таку ж відповідь. Я щойно написав це інакше (поверніть 2, якщо не каталог). Крім того, ці портативні рішення мають перевагу не викликати жодних зовнішніх програм, що може вважатися плюсом для обмежених або вбудованих систем. Мене хвилює лише те, що використання "()" може створити новий підпроцес (або принаймні змусити скопіювати середовище та речі, а потім переключитися назад). Погляньте на це: is_empty () {_d = "$ {1: -.}"; [! -d "$ {_ d}"] && return 2; set - "$ {_ d}" / * "$ {_ d}" /. ["$ { }" = "$ {_ d} / $ {_ d} /. [!.] * $ {_ d} /..?*"]; };
Дієго Аугусто Моліна

@DiegoAugustoMolina Нещодавно в проекті мені довелося зробити цей тест ще раз, якщо каталог був порожнім, на початку я використовував python, то оскільки я практично встановив python саме для цього, я реалізував тест на c, реалізація надзвичайна банальність, мені цікаво, чому його ніколи не додавали як тест чи як окрему команду
Алекс

1
Нещодавно я теж потребував вирішення цієї проблеми для (дійсно) обмеженої системи. Я навіть трохи оптимізував попередній код, щоб взагалі не використовувати зайвих змінних. Хакі і некрасиво виглядають однопластові, але чудові. Подайте себе:is_empty(){ [ ! -d "${1}" ] && return 2;set -- "${1}" "${1}"/* "${1}"/.[!.]* "${1}"/..?*;[ "${*}" = "${1} ${1}/* ${1}/.[!.]* ${1}/..?*" ]; };
Дієго Аугусто Моліна

2

ЗШ

Я знаю, що питання було позначене як баш; але, лише для довідки, для користувачів zsh :

Перевірка на непорожній каталог

Щоб перевірити, чи fooнемає порожнього:

$ for i in foo(NF) ; do ... ; done

де, якщо fooвін не порожній, код у forблоці буде виконуватися.

Перевірка порожнього каталогу

Щоб перевірити, чи fooпорожній:

$ for i in foo(N/^F) ; do ... ; done

де, якщо fooпорожній, forбуде виконаний код у блоці.

Примітки

Нам не потрібно було цитувати каталог fooвище, але ми можемо це зробити, якщо нам потрібно:

$ for i in 'some directory!'(NF) ; do ... ; done

Ми також можемо протестувати кілька об'єктів, навіть якщо це не каталог:

$ mkdir X     # empty directory
$ touch f     # regular file
$ for i in X(N/^F) f(N/^F) ; do echo $i ; done  # echo empty directories
X

Все, що не є каталогом, буде просто проігноровано.

Екстри

Оскільки ми є глобальними, ми можемо використовувати будь-який глобус (або розширення дужок):

$ mkdir X X1 X2 Y Y1 Y2 Z
$ touch Xf                    # create regular file
$ touch X1/f                  # directory X1 is not empty
$ touch Y1/.f                 # directory Y1 is not empty
$ ls -F                       # list all objects
X/ X1/ X2/ Xf Y/ Y1/ Y2/ Z/
$ for i in {X,Y}*(N/^F); do printf "$i "; done; echo  # print empty directories
X X2 Y Y2

Ми також можемо вивчити об'єкти, які розміщені в масиві. Наприклад, із каталогами, як описано вище:

$ ls -F                       # list all objects
X/ X1/ X2/ Xf Y/ Y1/ Y2/ Z/
$ arr=(*)                     # place objects into array "arr"
$ for i in ${^arr}(N/^F); do printf "$i "; done; echo
X X2 Y Y2 Z

Таким чином, ми можемо перевірити об'єкти, які вже можуть бути встановлені в параметрі масиву.

Зауважте, що код у forблоці, очевидно, виконується в кожному каталозі по черзі. Якщо це не бажано, ви можете просто заповнити параметр масиву і потім працювати над цим параметром:

$ for i in *(NF) ; do full_directories+=($i) ; done
$ do_something $full_directories

Пояснення

Для користувачів zsh існує (F)глобальний класифікатор (див. man zshexpn), Який відповідає "повному" (не порожньому) каталогу:

$ mkdir X Y
$ touch Y/.f        # Y is now not empty
$ touch f           # create a regular file
$ ls -dF *          # list everything in the current directory
f X/ Y/
$ ls -dF *(F)       # will list only "full" directories
Y/

Класифікатор (F)перераховує об'єкти, які відповідають: це каталог І не порожній. Отже, (^F)відповідає: не каталог АБО порожній. Таким чином, (^F)поодинці були б також перелічені звичайні файли, наприклад. Таким чином, як пояснено на сторінці zshexpman, нам також потрібен (/)глобальний класифікатор, який містить лише каталоги:

$ mkdir X Y Z
$ touch X/f Y/.f    # directories X and Y now not empty
$ for i in *(/^F) ; do echo $i ; done
Z

Таким чином, щоб перевірити, чи вказаний каталог порожній, ви можете запустити:

$ mkdir X
$ for i in X(/^F) ; do echo $i ; done ; echo "finished"
X
finished

і просто переконатися, що не порожній каталог не буде захоплений:

$ mkdir Y
$ touch Y/.f
$ for i in Y(/^F) ; do echo $i ; done ; echo "finished"
zsh: no matches found: Y(/^F)
finished

На жаль! Оскільки Yне порожньо, zsh не знаходить відповідності для (/^F)("каталоги, які порожні"), і, таким чином, висилає повідомлення про помилку, вказуючи, що не було знайдено відповідностей для глобального. Тому нам потрібно придушити ці можливі повідомлення про помилки за допомогою (N)глобального класифікатора:

$ mkdir Y
$ touch Y/.f
$ for i in Y(N/^F) ; do echo $i ; done ; echo "finished"
finished

Таким чином, для порожніх каталогів нам потрібен класифікатор (N/^F), який ви можете прочитати так: "не попереджайте мене про збої, каталоги, які не заповнені".

Аналогічно, для непорожніх каталогів нам потрібен кваліфікатор (NF), який ми можемо також прочитати так: "Не попереджайте мене про збої, повні каталоги".


1

Я здивований, що в путівниках по шумних справах про порожні каталоги не згадувалося. Цей посібник, і справді весь шум, обов'язково читається для питань типу оболонки.

Зверніть увагу на цій сторінці:

Ніколи не намагайтеся проаналізувати вихід. Навіть рішення ls -A можуть зламатися (наприклад, на HP-UX, якщо ви root, ls -A робить абсолютно протилежне тому, що відбувається, якщо ви не root - і ні, я не можу скласти щось неймовірно дурний).

Насправді, можна взагалі бажати уникати прямого питання. Зазвичай люди хочуть знати, чи порожній каталог, оскільки вони хочуть зробити щось із залученням файлів у ньому тощо. Наприклад, один із цих прикладів на основі знахідки може бути відповідним рішенням:

   # Bourne
   find "$somedir" -type f -exec echo Found unexpected file {} \;
   find "$somedir" -maxdepth 0 -empty -exec echo {} is empty. \;  # GNU/BSD
   find "$somedir" -type d -empty -exec cp /my/configfile {} \;   # GNU/BSD

Найчастіше все, що дійсно потрібно, - це щось подібне:

   # Bourne
   for f in ./*.mpg; do
        test -f "$f" || continue
        mympgviewer "$f"
    done

Іншими словами, особа, яка задає питання, могла подумати, що потрібен явний тест порожнього каталогу, щоб уникнути повідомлення про помилку, наприклад, mympgviewer: ./*.mpg: Немає такого файлу чи каталогу, коли насправді такого тесту не потрібно.



1

Взявши підказку (або кілька) з відповіді olibre, мені подобається функція Bash:

function isEmptyDir {
  [ -d $1 -a -n "$( find $1 -prune -empty 2>/dev/null )" ]
}

Тому що, хоча він створює одну нижню оболонку, це наближення до рішення O (1), наскільки я можу собі уявити, і надання йому імені робить його читабельним. Тоді я можу писати

if isEmptyDir somedir
then
  echo somedir is an empty directory
else
  echo somedir does not exist, is not a dir, is unreadable, or is  not empty
fi

Що стосується O (1), то існують випадкові випадки: якщо у великому каталозі було видалено все або все, окрім останнього запису, видалено, "знайти", можливо, доведеться прочитати все, щоб визначити, чи він порожній. Я вважаю, що очікувана продуктивність становить O (1), але в гіршому випадку лінійний розмір каталогу. Я цього не вимірював.


0

Поки що я не бачив відповіді, яка використовує греп, який, на мою думку, дав би простішу відповідь (з не надто великою кількістю дивних символів!). Ось як би я перевірив, чи існують файли в каталозі, використовуючи оболонку bourne:

це повертає кількість файлів у каталозі:

ls -l <directory> | egrep -c "^-"

Ви можете заповнити шлях до каталогу, де записано каталог. Перша половина труби гарантує, що перший символ виводу є "-" для кожного файлу. Потім egrep підраховує кількість рядка, що починається з цього символу, використовуючи регулярні вирази. Тепер все, що вам потрібно зробити, це зберегти отримане число та порівняти його за допомогою зворотних цитат, як-от:

 #!/bin/sh 
 fileNum=`ls -l <directory> | egrep -c "^-"`  
 if [ $fileNum == x ] 
 then  
 #do what you want to do
 fi

x - змінна на ваш вибір.


0

Змішуючи речі з чорносливом та останні відповіді, я дістався

find "$some_dir" -prune -empty -type d | read && echo empty || echo "not empty"

що працює і для шляхів з пробілами



0

Я б пішов на find:

if [ -z "$(find $dir -maxdepth 1 -type f)" ]; then
    echo "$dir has NO files"
else
    echo "$dir has files"

Це перевіряє результати пошуку лише файлів у каталозі, не переходячи до підкаталогів. Потім він перевіряє вихід за допомогою -zпараметра, взятого з man test:

   -z STRING
          the length of STRING is zero

Дивіться деякі результати:

$ mkdir aaa
$ dir="aaa"

Порожній реж:

$ [ -z "$(find aaa/ -maxdepth 1 -type f)" ] && echo "empty"
empty

Просто дріз у ньому:

$ mkdir aaa/bbb
$ [ -z "$(find aaa/ -maxdepth 1 -type f)" ] && echo "empty"
empty

Файл у каталозі:

$ touch aaa/myfile
$ [ -z "$(find aaa/ -maxdepth 1 -type f)" ] && echo "empty"
$ rm aaa/myfile 

Файл у підкаталозі:

$ touch aaa/bbb/another_file
$ [ -z "$(find aaa/ -maxdepth 1 -type f)" ] && echo "empty"
empty

0

З деяким вирішенням я міг знайти простий спосіб дізнатися, чи є файли в каталозі. Це може поширюватися на додаткові команди grep для перевірки конкретно файлів .xml або .txt тощо. Наприклад:ls /some/dir | grep xml | wc -l | grep -w "0"

#!/bin/bash
if ([ $(ls /some/dir | wc -l  | grep -w "0") ])
    then
        echo 'No files'
    else
        echo 'Found files'
fi

-1
if ls /some/dir/* >/dev/null 2>&1 ; then echo "huzzah"; fi;

Мені подобається ця, оскільки немає жодних лапок або дужок, які розбивають команду.
Дейв Вебб

Обережно не використовувати це, якщо ви встановили nullglob, бо тоді lsкоманда буде успішною.
Стів Келет

Не працює в усіх середовищах, якщо в каталозі є крапки.
Дієго Аугусто Моліна

-1

перевірити конкретний цільовий каталог

if [ -d $target_dir ]; then
    ls_contents=$(ls -1 $target_dir | xargs); 
    if [ ! -z "$ls_contents" -a "$ls_contents" != "" ]; then
        echo "is not empty";
    else
        echo "is empty";
    fi;
else
    echo "directory does not exist";
fi;

-1

Спробуйте знайти команду. Вкажіть каталог із жорстким кодом або як аргумент. Потім ініціюйте пошук для пошуку всіх файлів всередині каталогу. Перевірте, чи повернення знахідки недійсне. Відлуння даних знахідки

#!/bin/bash

_DIR="/home/user/test/"
#_DIR=$1
_FIND=$(find $_DIR -type f )
if [ -n "$_FIND" ]
then
   echo -e "$_DIR contains files or subdirs with files \n\n "
   echo "$_FIND"
else
echo "empty (or does not exist)"
fi

Якщо в каталозі є порожні каталоги або нестандартні файли (розетки, пристрої char, символьні посилання тощо), це все не працюватиме. Повідомлялося б, що каталог порожній.
Дієго Аугусто Моліна

@DiegoAugustoMolina, якщо я правильно зрозумів, у запитанні було те, що ми хочемо перевірити, чи існують файли (як файли в прямому значенні), тому був використаний аргумент причини -f. але ваші коментарі все ще відповідають дійсності.
igiannak

-2

Мені не подобаються ls - Aопубліковані рішення. Швидше за все, ви хочете перевірити, чи каталог порожній, оскільки ви не бажаєте його видаляти. Наступне робить це. Якщо ви просто хочете записати порожній файл, безумовно, видалити та відтворити його швидше, тоді перерахування можливо нескінченних файлів?

Це має працювати ...

if !  rmdir ${target}
then
    echo "not empty"
else
    echo "empty"
    mkdir ${target}
fi

4
Це не працює, якщо користувач не має дозволу на запис ${target}/...
Єнс

Просто погана ідея зробити тест руйнівним. Крім усього іншого, він вводить умови перегонів.
4dummies

-2

Для мене це добре працює (коли існує реж):

some_dir="/some/dir with whitespace & other characters/"
if find "`echo "$some_dir"`" -maxdepth 0 -empty | read v; then echo "Empty dir"; fi

Повна перевірка:

if [ -d "$some_dir" ]; then
  if find "`echo "$some_dir"`" -maxdepth 0 -empty | read v; then echo "Empty dir"; else "Dir is NOT empty" fi
fi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.