LINUX.ORG.RU

РАЗРАБОТКА СЦЕНАРИЕВ BASH

 


1

4

В текущем каталоге найти количество файлов, имеющих различные имена, но одинаковые размеры. Вывести на экран величину размера и имена файлов, имеющих данный размер.


Уже май месяц, сессия началась. В преддверии ЧМ так вообще все вузы центральной России торопятся как никогда.

anonymous
()
Ответ на: комментарий от driver

Читай внимательнее, я уже отвечал на этот вопрос. Имя файла уникально, а значит оно не может быть не различно. Условие задачи выполняется.

Вам просто пытаются сказать то, что сами не могут сформулировать, но чувствуют интуитивно. :) Ваше решение плохо потому, что вы формируете в массиве не алгоритмические данные, а просто строку для последующего вывода. Это не правильно, так как для примера может быть имя файла как «a, b» - почему собственно нет?

Но и в общем ваше решение ужасно. За `ls | grep` надо побивать камнями. Ну что такого сложно в «for f in * .*» ? Каталоги можно отсекать как [ ! -d «$f» ]

vodz ★★★★★
()
Ответ на: комментарий от mogwai

Двачую, еще как удовлетворяет. А у тебя проблемы с пониманием базовых концепций дискретной математики налицо.

mersinvald ★★★★★
()
Ответ на: комментарий от mogwai

ТС, думаю, отчислят, с таким подходом.

Поржал. Ты недооцениваешь уровень шланговства и забивательства преподов на это в бюджетных ВУЗах (исключаем топовые, конечно).

У нас большая часть потока выезжала на лабах, которые делал я с парой приятелей, для студентов это была неплохая прибавка, почти как нормальная стипендия, какой она должна была быть, если бы ее индексировали)

mersinvald ★★★★★
()
Ответ на: комментарий от vodz

Вам просто пытаются сказать то, что сами не могут сформулировать, но чувствуют интуитивно. :)

О, я знаю, что мне пытаются сказать. И я уверен, что самой задачи это нисколько не касается.

Ваше решение плохо потому, что вы формируете в массиве не алгоритмические данные, а просто строку для последующего вывода. Это не правильно, так как для примера может быть имя файла как «a, b» - почему собственно нет?

Формат вывода не был обговорен в условиях задачи, как и алгоритмичность выводимых данных. Впрочем, вы вольны заменить запятую на любой другой разделитель, который не разрешен в именах файлов. '/' - идеальный кандидат, как по мне.

--- a.sh        2018-05-08 11:09:56.287950089 +0300
+++ b.sh        2018-05-08 11:09:56.287950089 +0300
@@ -6,7 +6,7 @@
 declare -A filesBySize
 for fileName in `ls -pa $1 | grep -v /`; do
     fileSize=`stat -c%s $1/$fileName`
-    filesBySize[$fileSize]="${filesBySize[$fileSize]}${filesBySize[$fileSize]:+, }$fileName"
+    filesBySize[$fileSize]="${filesBySize[$fileSize]}${filesBySize[$fileSize]:+ / }$fileName"
 done
 for fileSize in "${!filesBySize[@]}"; do
     echo "Файлы с размером $fileSize байт: ${filesBySize[$fileSize]}";
driver
()
Ответ на: комментарий от driver

… можно ли найти в текущем каталоге файлы имеющие НЕ различные имена?

Какой… нечестный вопрос.

Читая комментарии вспомнилась байка, как прохожий проходя мимо школы увидел класс учеников сажающих саженцы деревьев корнями вверх. Подбегает прохожий к преподавателю и на вопрос — Что вы делаете? Ведь из этого ничего не вырастет, получает ответ — Что из этого вырастает послушание

kolja ★★
()
Ответ на: комментарий от vodz

Но и в общем ваше решение ужасно. За `ls | grep` надо побивать камнями. Ну что такого сложно в «for f in * .*» ? Каталоги можно отсекать как [ ! -d «$f» ]

Мое решение превосходно. А вот вы предлагаете лишний раз обратиться к жесткому диску. Или вы думаете, что это ваше -d бесплатно?

driver
()
Ответ на: комментарий от kolja

Какой… нечестный вопрос.

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

driver
()
Ответ на: комментарий от driver

А ты думаешь, сабпроцесс, вызванный пайпом, бесплатный?

К тому же, у тебя в «ls -pa» и так идёт проверка на директории. Та самая, «не бесплатная», которая добавляет директориям слэш в конце имени

Deleted
()
Последнее исправление: ecko (всего исправлений: 1)
Ответ на: комментарий от driver

По мне, так там камня на камне не осталось после «намёка»

kolja ★★
()
Ответ на: комментарий от driver

Формат вывода не был обговорен в условиях задачи

Вот видите, вы опять ничего не поняли и потому программист из вас, к сожалению, похоже самоучка, без понимания общих вещей. Именно, что не обговорён. Завтра захотят расширить задачу на подкаталоги и '/' тоже будет занятно. Но вывод при этом могут затребовать как zero-terminated, что точно уже не прикопаешься. Дело то не в выводе, дело в том, что вашим массивом нельзя воспользоваться для произведения любых мелких изменений задачи.

Мое решение превосходно.

Спасибо, вы сделали мой день.

А вот вы предлагаете лишний раз обратиться к жесткому диску.

Во-первых, ls | grep очень не бесплатны, во-вторых, каталог и и таблица инодов в конечном итоге все равно будет считана и закешированна, ведь далее всё равно у вас 'stat'.

vodz ★★★★★
()
Ответ на: комментарий от Deleted

А ты думаешь, сабпроцесс, вызванный пайпом, бесплатный?

Дешевле обращения к диску. Впрочем, баш - это не про оптимальность, о чем я и написал в своем первом посте с однострочным высером.

К тому же, у тебя в «ls -pa» и так идёт проверка на директории. Та самая, «не бесплатная», которая добавляет директориям слэш в конце имени

А вы предлагаете вместо одного заполнения массива структур dirent, который происходит в ls, получать по новой структуре в цикле для каждого файла? Да вы просто мастер оптимизации!

driver
()
Ответ на: комментарий от driver

А вы предлагаете вместо одного заполнения массива структур dirent, который происходит в ls, получать по новой структуре в цикле для каждого файла?

Ага. Три весёлых буквы «VFS» тебе говорят о чём-нибудь? Фигню написал. Речь шла о том, что метадата всё равно закешируется, и обращения к диску за метадатой *каждого* файла не будет

Deleted
()
Последнее исправление: ecko (всего исправлений: 1)
Ответ на: комментарий от driver

А вы предлагаете вместо одного заполнения массива структур dirent, который происходит в ls, получать по новой структуре в цикле для каждого файла?

Бгг. Вы сами то понимаете то, что пишите?

for i in * *.; do [ ! -d "$i" ]
это и есть реализация ls | grep на bash, с таким же вызовом сисколов но на pipe/fork+fork/exec+exec меньше.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 2)
Ответ на: комментарий от vodz

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

Башу в ВУЗе меня не обучали, каюсь. А вы, видимо, заканчивали ту же шарашку, где придумали задачу из ОП.

Завтра захотят расширить задачу на подкаталоги и '/' тоже будет занятно.

Слать лелом таких заказчиков надо.

Дело то не в выводе, дело в том, что вашим массивом нельзя воспользоваться для произведения любых мелких изменений задачи.

Можно воспользоваться. Я разрешаю.

Спасибо, вы сделали мой день.

Пожалуйста.

Во-первых, ls | grep очень не бесплатны, во-вторых, каталог и и таблица инодов в конечном итоге все равно будет считана и закешированна, ведь далее всё равно у вас 'stat'.

А вот и ваше образование вылезло. Вот так вот учат в ваших этих ВУЗ'ах. Нет там никакого стата - там 1 вызов sys_getdents, который махом получает массив структур из ядра.

driver
()
Ответ на: комментарий от vodz

Бгг. Вы сами то понимаете то, что пишите?

The system call getdents() reads several linux_dirent structures from the directory referred to by the open file descriptor fd into the buffer pointed to by dirp. The argu‐ ment count specifies the size of that buffer.

           struct linux_dirent {
               unsigned long  d_ino;     /* Inode number */
               unsigned long  d_off;     /* Offset to next linux_dirent */
               unsigned short d_reclen;  /* Length of this linux_dirent */
               char           d_name[];  /* Filename (null-terminated) */
                                 /* length is actually (d_reclen - 2 -
                                    offsetof(struct linux_dirent, d_name)) */
               /*
               char           pad;       // Zero padding byte
               char           d_type;    // File type (only since Linux
                                         // 2.6.4); offset is (d_reclen - 1)
               */
           }

d_type вам ни о чем не говорит? И где тут нужно стат дергать для каждого файла, как предложили вы?

driver
()
Ответ на: комментарий от driver

Нет там никакого стата - там 1 вызов sys_getdents, который махом получает массив структур из ядра.

Не, образование как раз не подвело, обычный readdir, а не для linux_dirent структуры не возвращает данные о каталоге. Впрочем, и getdents не умеет почти ничего более, скажем, размер файла не даёт и потому stat у вас вызывается явно. Удивительно, кстати, в том, что вот при таком расширении sh в bash до сих пор нет встроенного stat.

vodz ★★★★★
()
Ответ на: комментарий от driver

И где тут нужно стат дергать для каждого файла, как предложили вы?

Конечно. А вы думаете, что ls поступает как то иначе? По крайней мере те исходники, что я видел, такой фигней не страдают, ибо задачи максимально быстро, максимально непереносимо, но с дурацким переключением заполненной структуры от ключей вызова у утилиты ls не стоит.

vodz ★★★★★
()
Ответ на: комментарий от driver

Можете мне больше не писать. Вашу компетентность я уже оценил.

Что-то мне это напоминает. А, Царя сишки. То же самое — поймали на стандартнейшей ошибки начинающего (удивительно, как это Царь bash-а Zmicier такое пропустил, он раньше не проходил мимо на for `ls`) и давай изворачиваться всяким бредом.

vodz ★★★★★
()
Ответ на: комментарий от driver

Как это противоречит заданию найти разных файлов одного размера в одном каталоге?

mogwai ★★★★
()
Ответ на: комментарий от driver

Глупый юзернейм, а формулировка такая, чтобы студенты не спрятались за множеством из одного элемента в ситуации, когда проспали фильтрануть элементы с одним файлом.

mogwai ★★★★
()
Ответ на: комментарий от vodz

За `ls | grep` надо побивать камнями.

«for f in * .*»

а за вот это можно и обосцать с ного до головы зы сраная капча

anonymous
()
Ответ на: комментарий от anonymous

а за вот это можно и обосцать с ного до головы зы сраная капча

Дооо, три дня за вами бежала, чтобы пукнуть в лужу.

vodz ★★★★★
()
Ответ на: комментарий от mersinvald

«Одно уникальное имя» удовлетворяет условию «все имена различны»

«Ноль уникальных имён» тоже удовлетворяет условию «все имена различны»?

justAmoment ★★★★★
()
Ответ на: комментарий от mogwai

Если файл с таким размером один, каким образом он станет одним из «файлов имеющих различные имена но один размер»?

автор задачи не умеет понятно описывать. оттого и разночтения. распостраненное в ru явление.

barberry ★★
()
Ответ на: комментарий от justAmoment

«Ноль уникальных имён» тоже удовлетворяет условию «все имена различны»?

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

IchBinFertig
()
Ответ на: комментарий от xmikex

Ну так а что тема не названа «Сделайте за меня задание»?

Это тут не надо, ибо и так понятно после слов «найти» и «вывести». :)

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

vodz ★★★★★
()
Ответ на: комментарий от barberry

автор задачи не умеет понятно описывать. оттого и разночтения. распостраненное в ru явление.

Там выше приводили название лабораторки, из которой взято это задание. Она легко гуглится. И 99.99% эта лабораторка была создана до внедрение всех этих ваших ЕГЭ. Когда я спрашивал у студиозов подобным образом сформулированные вопросы, подразумевалось что есть 3 правильных ответа: «a», «b» и «c». Только каждый из них был на разную оценку: a=4, b=4+, c=5. И если студенту нужно задать доп. вопрос, чтобы прояснить сам ли он писал данное решение, то первое предложение легким движением превращается в более сложную версию: «В первых двух подкаталогах текущего каталога найти количество файлов, имеющих различные имена, но одинаковые размеры.»

justAmoment ★★★★★
()
Ответ на: комментарий от justAmoment

Конечно да, в пустом множестве все элементы различны.

Вообще говоря в любом множестве все элементы различны: если это не так, то это не множество.

То есть то что пустое множество является множеством — прямое доказательство того, что все элементы в нем различны.

mersinvald ★★★★★
()
Последнее исправление: mersinvald (всего исправлений: 1)

НУЖНО БОЛЬШЕ КАПСА!!!

anonymous
()
Ответ на: комментарий от xmikex

А смысл? Даже если напрямую так написать — нынешние кукаретики ничего сделать не смогут, только как обычно завизжат, увидев какой-нибудь хотя бы и малейший повод для срача,а дальше говно уже само потечёт по направлению к вентилятору.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.