Size: a a a

2021 February 02

x

xoyozo in pro.bash
источник

AG

Artemy Gevorkov in pro.bash
xoyozo
привет, почему в массив добавляется по 1 элементу/слову из строки а не строка целеком
Для такого, вроде, mapfile используют.
источник

x

xoyozo in pro.bash
а до bash v4 как? да и просто интересно печатает строку, а добавляет по слову в массив
источник

∀lǝxǝʎ in pro.bash
xoyozo
while read line
           do
               echo $line
               words_array+=($line)
               echo "*******"
               echo "${words_array[$a]}"
               let "a = $a+1"
               echo "*******"
           done < $file_name
"$line" надо кавычить
((a++)) а не let
источник

x

xoyozo in pro.bash
words_array+=("$line") ??? ничего не выводит
источник

AG

Artemy Gevorkov in pro.bash
xoyozo
а до bash v4 как? да и просто интересно печатает строку, а добавляет по слову в массив
Потому что баш сам сплитит, когда нет кавычек.
источник

∀lǝxǝʎ in pro.bash
xoyozo
words_array+=("$line") ??? ничего не выводит
а что должен выводить? Это добавление элемента в массив
источник

x

xoyozo in pro.bash
выводит learn - учить, заносит в массив что то из 3ёх эелементов строки
источник

∀lǝxǝʎ in pro.bash
Artemy Gevorkov
https://pastebin.c om/wBWe5GSq
1. я уже много раз убеждался что писать usage удобнее в переменную, а не как функцию
2. функцию лог можно переписать на один вызов printf заодно избавимся от вызова внешней утилиты date
3. вместо give_up() просится более стандартный die(), и тут как раз видно что print_usage не должен быть функцией, тут вместо просто вывода сообщения произошёл ещё и выход с нулевым кодом, вместо ожидаемого
4. разбор опций через getopts весьма ущербен. но по мере использования может напишите свою функцию
5. делать функцию main и set_parameters считаю извращением и попыткой подразить другим языкам (не будем показывать пальцем), кроч просто не нужны они
6. не возлагайте больших надежд на set -e
источник

AG

Artemy Gevorkov in pro.bash
∀lǝxǝʎ
1. я уже много раз убеждался что писать usage удобнее в переменную, а не как функцию
2. функцию лог можно переписать на один вызов printf заодно избавимся от вызова внешней утилиты date
3. вместо give_up() просится более стандартный die(), и тут как раз видно что print_usage не должен быть функцией, тут вместо просто вывода сообщения произошёл ещё и выход с нулевым кодом, вместо ожидаемого
4. разбор опций через getopts весьма ущербен. но по мере использования может напишите свою функцию
5. делать функцию main и set_parameters считаю извращением и попыткой подразить другим языкам (не будем показывать пальцем), кроч просто не нужны они
6. не возлагайте больших надежд на set -e
Спасибо огромное!
Переменная usage должна быть глобальной, разумеется?
А как тогда лучше таймстемпить логи?
Вместо getopts предпочительнее обычный case?
источник

∀lǝxǝʎ in pro.bash
Artemy Gevorkov
Спасибо огромное!
Переменная usage должна быть глобальной, разумеется?
А как тогда лучше таймстемпить логи?
Вместо getopts предпочительнее обычный case?
Да, usage глобальная. кнеч. А дальше типа die "$usage", или как там угодно

Таймстемпить? Вместо date? В bash есть хак, который научил printf понимать strftime: %(datefmt)T

Да, мы case юзаем, он не то что бы очень простой получается, но зато достаточно удобный. Я уж и не помню какие есть у getopts грабли, кроме отсутствия long опций. Можно ещё смотреть на gnu getopt, но хз как-то.
источник

AG

Artemy Gevorkov in pro.bash
Всё понял. Ещё раз большое спасибо. :)
источник

ł

łibfitź.r13.a in pro.bash
Господа, нужно найти все файлы, имя которых содержит в себе имя родительской папки, а-ля something/dir/.dir. Уставший мозг придумал решение, но адски медленное на больших объемах:

find ${_basedir} -type f >| list.txt
while read x; do
   if [ "$(basename ${x})" = ".$(basename "$(dirname ${x})")" ]; then
       printf '%s\n' "${x}"
   fi
done < list.txt

Понимаю, что эффективность ужасная, как улучшить - уже не понимаю
источник

Лс

Лень с Самосознанием... in pro.bash
łibfitź.r13.a
Господа, нужно найти все файлы, имя которых содержит в себе имя родительской папки, а-ля something/dir/.dir. Уставший мозг придумал решение, но адски медленное на больших объемах:

find ${_basedir} -type f >| list.txt
while read x; do
   if [ "$(basename ${x})" = ".$(basename "$(dirname ${x})")" ]; then
       printf '%s\n' "${x}"
   fi
done < list.txt

Понимаю, что эффективность ужасная, как улучшить - уже не понимаю
find -name "$(find директории)"
источник

ł

łibfitź.r13.a in pro.bash
Директорий потенциально дофига
источник

Лс

Лень с Самосознанием... in pro.bash
łibfitź.r13.a
Директорий потенциально дофига
И?
источник

∀lǝxǝʎ in pro.bash
łibfitź.r13.a
Господа, нужно найти все файлы, имя которых содержит в себе имя родительской папки, а-ля something/dir/.dir. Уставший мозг придумал решение, но адски медленное на больших объемах:

find ${_basedir} -type f >| list.txt
while read x; do
   if [ "$(basename ${x})" = ".$(basename "$(dirname ${x})")" ]; then
       printf '%s\n' "${x}"
   fi
done < list.txt

Понимаю, что эффективность ужасная, как улучшить - уже не понимаю
find /tmp/dir* -type f -exec bash -c '[[ "$(basename "$(dirname {})")" == "$(basename "{}")" ]]' \; -print
не проверял производительность, но в целом должно быть не очень плохо
НО самое правильно конечно, типа того как ты сразу сделал, т.е. получить список файлов с путями и дальше разобрать его, потому что миллионы fork+exec на basename+dirname это швах, можно либо разобрать руками просто через ${}, это если точно известно что в именах каталогов и файлов нет всякого говна, либо отправить в какой-нить perl где есть библиотеки разбирающие пути без бесконечных форков
источник

ł

łibfitź.r13.a in pro.bash
Да я в итоге в питон отправил, отлично получилось
источник

∀lǝxǝʎ in pro.bash
ой, ну и == поменять на =~ в соответствии с условиями
источник

ł

łibfitź.r13.a in pro.bash
os.walk оказался в какие-то немыслимые разы быстрее того костыля
источник