LINUX.ORG.RU

подсчет файлов в каталогах в скрипте

 ,


0

1

проблема, пытаюсь посчитать количество файлов в каталоге если выполнять просто команду в консоле то все ок: и find ./dd -maxdepth 1 -type f | wc -l и ls ./dd | wc -l нормально считают, но при выполнении в скрипте d=ls ${d} | wc -l выдают ошибку ./dd: Permission denied а переменная d равно 0.

в чем может быть косяк?


Так команда d=ls ${d} | wc -l — это значит установка в переменную d строки «ls» и с этим окружением запускается команда из переменной d, но при этом используется старое значение переменной. Если оно было пустым, то просто происходит присваивание.

Если у тебя была строка "./dd", то она интерпретируется как команда, но при этом ./dd является директорией, а не исполнимым файлом, вот и выдаётся ошибка.

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

Использование в данной задаче ls — костыль, выдающий.

d="$(find "${d}" -not -type d | wc -l)"
Найдёт все НЕ-директории (то есть, по сути, файлы — линки, сокеты, блочные устройства, fifo etc) рекурсивно и подсчитает их количество. Если нужно только в текущей директории, но не в поддиректориях, то ты уже в курсе про -masdepth 1.

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

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

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

Использование в данной задаче ls — костыль, выдающий.

Сами придумали?

1. -maxdepth нет в posix http://pubs.opengroup.org/onlinepubs/009695399/utilities/find.html

2. ls удобен: получаем список файлов без имени каталога, иногда это именно и надо, не надо вырезать; можно отсортировать по; можно задать ключом надо или нет файлы начинающиеся с '.' и т. д.

vodz ★★★★★
()

возникла еще одна проблемка

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

if (($kk>'0.76')) then mv $d "./76-100" elif (($kk>'0.51')) then mv $d "./51-75" elif (($kk>'0.26')) then mv $d "./26-50" elif (($kk>'0.01')) then mv $d "./1-25" elif (($kk<'0.01')) then mv $d "./0" fi все файлы сыплются в папку 51-76. синтаксис пробовал разный, if [ «$a» -gt «$b» ], ((«$a» > «$b»)) пробовал и " и ' но упорно все файлы уходят в одну папку

irq15
() автор топика
Ответ на: комментарий от r3lgar

А Bash — POSIX? find более гибкий.

И bash и find можно юзать оставаясь в рамках posix, но тогда возникает проблема использования find не по назначению, ибо find изначально просматривает всю вложенность. Более того, в рамках bash можно сделать маску с символом '/', а find такую вообще не воспринимает, так что насчёт гибкости - увы и ах.

Не бог весь какая вселенская проблема, если б не ваше «костыль выдающий», которое как раз выдаёт вас как злобного тролля.

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

костыль выдающий

На самом деле это недописанное предложение, я просто психанул, поставил точку и пошёл дальше.

выдаёт вас как злобного тролля

Даже не пытался вбрасывать.

И bash и find можно юзать оставаясь в рамках posix

И получить куцые утилиты. Если юзается bash, то я подразумеваю, что это GNU Userland. Зачем ограничивать себя в чём-то, если кроме религиозных взглядов ничто не запрещает? Да, переносимость страдает, но в ОП ничего не сказано об этом.

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

Зачем ограничивать себя в чём-то, если кроме религиозных взглядов ничто не запрещает?

Не стоит делать категоричные утверждения, они как раз и ограничивают. Вот сейчас я перевожу turtlefirewall с perl на ash. Почему? А потому что не в каждый роутер удастся впихать perl или bash . А тому же openwrt межсетевой экран с управлением через www очень не достаёт. Руки сами тянутся вписать какой-нибудь bash-изм, но приходится сдерживаться чертыхаясь.

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

Вот сейчас я перевожу

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

То есть я не говорю, что нужно что-то делать, только потому, что можно. Я говорю, что если в конкретной задаче нет ограничений, то не нужно себя ограничивать искуственно.

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

Я говорю, что если в конкретной задаче нет ограничений, то не нужно себя ограничивать искуственно.

Вы не распарсили последнее предложение. Тяп-ляпное решение конкретной задачи создаёт плохую привычку. Если завтра вам придётся админить хост, на котором окружение со своими заморочками, но таки совместимо с posix, то лучше и за posix и не выходить при наличии альтернативы. Мне проще, я с этого начинал и помню разницу, а те кто никогда себя не ограничивал даже знания не имеет, где стандарты, а где — расширения, которые обходятся одной левой. Там где не левой, там проще поставить bash, что и делаю, а вот конкретно к этому топику — ls и универсальнее и не требует каких-то усилий, в отличии от find.

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

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

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