URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10171
[ Назад ]

Исходное сообщение
"Проверить наличие файлов в директории"

Отправлено Alexander7 , 13-Авг-17 09:17 
Надо просто проверить пустая ли директория.
Ожидал, что в test будет аналог -s FILE, но не нашёл.

Написал такой колхоз
[ $(ls DIR | wc -l) -eq 0 ]

Задача решена, но очевидно будет бредом, если директория может содержать "миллион" файлов.
И думаю вариант типа ls | head -n1 тоже не очень хорошо.

Есть ли более цивильное решение?

Спасибо


Содержание

Сообщения в этом обсуждении
"Проверить наличие файлов в директории"
Отправлено pavard , 13-Авг-17 16:59 
find DIR -maxdepth 0 -empty

"Проверить наличие файлов в директории"
Отправлено Andrey Mitrofanov , 14-Авг-17 12:22 
> find DIR -maxdepth 0 -empty

ммм, не работает. может, непустой stdout надо проверять...

[ -z "$(find "${DIR}" -maxdepth 0 -empty  -print -quit)" ] && echo 'наличие файлов в DIR'

Или вот так:

[ "$(find "${DIR}" -mindepth 1 -print -quit)" ]

По идее, с -quit д.бы быть быстрее, чем ls, но не проверял.


"Проверить наличие файлов в директории"
Отправлено ЫЫ , 15-Авг-17 08:12 
> find DIR -maxdepth 0 -empty

ключи:  
Цитирую автора:
"
1) могут меняться, 2) отличаться в разных реализациях, 3) это какой-то лютый здец так программировать. самого не коробит?
"

в частности:
find DIR -maxdepth 0 -empty
find: bad option -maxdepth



"Проверить наличие файлов в директории"
Отправлено Andrey Mitrofanov , 15-Авг-17 10:42 
> ключи:
> Цитирую автора:
> "
> 1) могут меняться, 2) отличаться в разных реализациях, 3) это какой-то лютый
> здец так программировать. самого не коробит?
> "
> в частности:
> find DIR -maxdepth 0 -empty
> find: bad option -maxdepth

Неблагодарный! Давно б уже "автора" монетизиорлвал, профессиональненько.

ЫЫ, 13:31 , 14-Авг-17, (13)

И да... за адаптацию под любую из дополнительных систем- я возьму дополнительные деньги...
    :)

---Бесконечная совместимомть -- за бесконечные деньги!!


"Проверить наличие файлов в директории"
Отправлено ЫЫ , 15-Авг-17 10:57 
> ---Бесконечная совместимомть -- за бесконечные деньги!!

Ну, смех смехом, а ... по сути то так и есть.


"Проверить наличие файлов в директории"
Отправлено pavard , 18-Авг-17 00:46 
это где у тебя опции нет?

"Проверить наличие файлов в директории"
Отправлено ЫЫ , 18-Авг-17 08:34 
> это где у тебя опции нет?

HP-UX
Кстати не пришедший из тьмы веков, а новенький :)


"Проверить наличие файлов в директории"
Отправлено Kazak , 13-Авг-17 20:40 
> Надо просто проверить пустая ли директория.
> Ожидал, что в test будет аналог -s FILE, но не нашёл.
> Написал такой колхоз
> [ $(ls DIR | wc -l) -eq 0 ]
> Задача решена, но очевидно будет бредом, если директория может содержать "миллион" файлов.
> И думаю вариант типа ls | head -n1 тоже не очень хорошо.
> Есть ли более цивильное решение?
> Спасибо

[ $(du --inodes DIR | cut -f1) -eq 1 ]


"Проверить наличие файлов в директории"
Отправлено pavard , 14-Авг-17 00:41 
du --inodes --max-depth 0
совершит обход всего каталога и вложенных. вариант медленее чем ls, предложенный автором.

"Проверить наличие файлов в директории"
Отправлено Kazak , 14-Авг-17 11:59 
> du --inodes --max-depth 0
> совершит обход всего каталога и вложенных. вариант медленее чем ls, предложенный автором.

Точно медленее, сорри



"Проверить наличие файлов в директории"
Отправлено ЫЫ , 14-Авг-17 10:35 
> Надо просто проверить пустая ли директория.
> Ожидал, что в test будет аналог -s FILE, но не нашёл.
> Написал такой колхоз
> [ $(ls DIR | wc -l) -eq 0 ]
> Задача решена, но очевидно будет бредом, если директория может содержать "миллион" файлов.
> И думаю вариант типа ls | head -n1 тоже не очень хорошо.
> Есть ли более цивильное решение?
> Спасибо

Отработайте выхлоп rm:
rm -di непустойкаталог
rm: невозможно удалить 'непустойкаталог': Каталог не пуст

rm -di пустойкаталог
rm: удалить каталог 'пустойкаталог'?


"Проверить наличие файлов в директории"
Отправлено ЫЫ , 14-Авг-17 10:36 
>[оверквотинг удален]
>> [ $(ls DIR | wc -l) -eq 0 ]
>> Задача решена, но очевидно будет бредом, если директория может содержать "миллион" файлов.
>> И думаю вариант типа ls | head -n1 тоже не очень хорошо.
>> Есть ли более цивильное решение?
>> Спасибо
> Отработайте выхлоп rm:
> rm -di непустойкаталог
> rm: невозможно удалить 'непустойкаталог': Каталог не пуст
> rm -di пустойкаталог
> rm: удалить каталог 'пустойкаталог'?

ну или гляньте исходник rm как он проверяет что каталог не пуст


"Проверить наличие файлов в директории"
Отправлено pavard , 14-Авг-17 11:39 
> Отработайте выхлоп rm:

для всех локалей?


"Проверить наличие файлов в директории"
Отправлено ЫЫ , 14-Авг-17 13:01 
>> Отработайте выхлоп rm:
> для всех локалей?

Это же ЮниксВэй.. какая вам разница что там за локаль у юзера? :) Работаете в своей.
делается так:
export LANGUAGE=en; rm -di непустойкаталог


"Проверить наличие файлов в директории"
Отправлено pavard , 14-Авг-17 13:14 
для всех реализаций и их сообщений? сообщения команд не относятся к апи и: 1) могут меняться, 2) отличаться в разных реализациях, 3) это какой-то лютый здец так программировать. самого не коробит?

"Проверить наличие файлов в директории"
Отправлено ЫЫ , 14-Авг-17 13:28 
> для всех реализаций и их сообщений? сообщения команд не относятся к апи
> и: 1) могут меняться, 2) отличаться в разных реализациях, 3) это
> какой-то лютый здец так программировать. самого не коробит?

Как так? Вы похоже только что с курсов телепатов...

Есть конкретная задача... Она решается.
Человек пишущий универсальный чекер на все случаи систем - и задающий такой вопрос- мягко говоря занимается не тем делом к которому у него есть талант.

Мое решение- быстро и эффективно, без оверхеда, решает задачу. на конкретной системе.
Ваши претензии- надуманны.

> и: 1) могут меняться,

если вы собираетесь использовать решение на многих системах неизвестной архитектуры- посмотрите как и было посоветовано исходник rm.

>2) отличаться в разных реализациях,

Человек собирается использовать свой скрипт на разных реализациях? Он вам это в личной переписке сказал? Или телепатия?


>3) это какой-то лютый здец так программировать. самого не коробит?

Это быстрое, простое и эффективное решение не претендующее на универсальность.
А почему это должно коробить?


"Проверить наличие файлов в директории"
Отправлено ЫЫ , 14-Авг-17 13:31 
>[оверквотинг удален]
> Как так? Вы похоже только что с курсов телепатов...
> Есть конкретная задача... Она решается.
> Человек пишущий универсальный чекер на все случаи систем - и задающий такой
> вопрос- мягко говоря занимается не тем делом к которому у него
> есть талант.
> Мое решение- быстро и эффективно, без оверхеда, решает задачу. на конкретной системе.
> Ваши претензии- надуманны.
>> и: 1) могут меняться,
> если вы собираетесь использовать решение на многих системах неизвестной архитектуры- посмотрите
> как и было посоветовано исходник rm.

И да... за адаптацию под любую из дополнительных систем- я возьму дополнительные деньги...
:)

Нет не треснет :)
>>2) отличаться в разных реализациях,
> Человек собирается использовать свой скрипт на разных реализациях? Он вам это в
> личной переписке сказал? Или телепатия?
>>3) это какой-то лютый здец так программировать. самого не коробит?
> Это быстрое, простое и эффективное решение не претендующее на универсальность.
> А почему это должно коробить?


"Проверить наличие файлов в директории"
Отправлено ЫЫ , 14-Авг-17 14:20 
>[оверквотинг удален]
> И да... за адаптацию под любую из дополнительных систем- я возьму дополнительные
> деньги...
> :)
> Нет не треснет :)
>>>2) отличаться в разных реализациях,
>> Человек собирается использовать свой скрипт на разных реализациях? Он вам это в
>> личной переписке сказал? Или телепатия?
>>>3) это какой-то лютый здец так программировать. самого не коробит?
>> Это быстрое, простое и эффективное решение не претендующее на универсальность.
>> А почему это должно коробить?

Ну и наконец..
"find DIR -maxdepth 0 -empty"
просто поражает своей привязкой к api, неотличаемостью на разных архитектурах и не коробимостью.. :)


"Проверить наличие файлов в директории"
Отправлено pavard , 14-Авг-17 23:48 
понимаю задел. тут даже если ты сам поймешь что не прав - об этом не скажешь и будешь доказывать провоту. если ты привык так писать - ок пиши.

"Проверить наличие файлов в директории"
Отправлено ыы , 15-Авг-17 06:16 
> понимаю задел. тут даже если ты сам поймешь что не прав -
> об этом не скажешь и будешь доказывать провоту. если ты привык
> так писать - ок пиши.

Ты похоже реально не понимаешь что ключи у программы- на разных платформах и разных реализациях могут быть разные... и нет принципиально никакой разницы между  тем что предложил я и тем что предложил ты...
Ну.. не понимаешь и не понимаешь... что ж тут поделаешь :)


"Проверить наличие файлов в директории"
Отправлено XAnder , 14-Авг-17 11:35 
> [ $(ls DIR | wc -l) -eq 0 ]
> Задача решена, но очевидно будет бредом, если директория может содержать "миллион" файлов.
> И думаю вариант типа ls | head -n1 тоже не очень хорошо.

Если верить исходникам ls, в некоторых случаях он может не читать весь каталог перед выводом, а выводить сразу:


              /* In this narrow case, print out each name right away, so
                 ls uses constant memory while processing the entries of
                 this directory.  Useful when there are many (millions)
                 of entries in a directory.  */
              if (format == one_per_line && sort_type == sort_none
                      && !print_block_size && !recursive)

Должно сработать что-то вроде этого:

ls -f1 | head -n3 | wc -l

Выведет 2 на пустом каталоге (. и ..) и 3 — на непустом.


"Проверить наличие файлов в директории"
Отправлено pavlinux , 18-Авг-17 01:10 
> Есть ли более цивильное решение?

for i in `find / -type d`; do if [ `stat -c%s $i` -gt 6 ]; then echo $i FULL; else rmdir $i; fi; done;