Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;

Модерирует : ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

Открыть новую тему     Написать ответ в эту тему

digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Товарищи вопрошающие! Если ваша система отлична от ГНУ, и в то же время вы желаете обойтись только дефолтными средствами, указывайте и то и другое сразу, пожалуйста.


UNIX Shell

 
   Это глобальная тема по юниксовой командной оболочке, как по интерактивной работе в командной строке, так и по шелл-скриптам. Ключевые слова: sh, bash, zsh, tcsh, busybox, readline, coreutils, cp, mv, ln, rm, ls, readlink, mkdir, touch, stat, date, test, sleep, chown, chmod, chattr, dd, df, du, env, echo, cat, less, man, grep, sort, findutils, find, locate, xargs, md5sum, cmp, diff, patch, ps, kill, killall, tar, gzip, bzip2, xz, mount, fdisk, parted, mkfs, fsck, e2fsprogs, mtools, ss, netcat, netstat, rsync, ssh, scp, sftp, lftp, ncftp, time, strace.
   Неинтерактивная обработка текста (sed, awk, perl) пока тоже здесь.
   Смотри в других ветках: wget, convert, montage, mogrify и др., gs, git, 7z, p7zip, soffice, mplayer, mencoder, vlc, vim, mc, mcedit, kioclient.
 
 

Hint! Русские маны (подустаревшие, не всегда полные и не всегда для вашей системы) можно попытаться найти на Опеннете, к примеру: bash, tar, grep.

 
Готовые решения:
  • commandlinefu.com
    Крупнейшая база полезных однострочников на командной оболочке с ранжированием на основе пользовательского голосования.
     
  • shell-fu.org
    Аналогично, но поменьше и формат записей более свободный, поэтому встречаются и однострочники, и развернутые скрипты, и просто советы.
     
  • Useful one-line scripts for sed
    Почти исчерпывающий список решений для тех случаев, когда sed незаменим. Более сложные скрипты с sed.sf.net — только для тех, кто знает толк... :)

 
Учебная литература:
  • Greg’s Wiki (http://mywiki.wooledge.org)
    Наиболее обширный авторский сборник постоянно обновляющихся материалов по Башу.

    1. Bash Pitfalls
      (Частые ошибки программирования на Баше: [1], [2], [3], [4], [5] — пер. на русский по сост. на дек. 2008 г.).
      Рассмотрены преимущественно ошибки, возникающие из-за непонимания отличия шелла от «нормальных» скриптовых языков. Если вы уже владеете, например, Перлом, то это вполне может быть ваше первое руководство для ознакомления с Башем.
    2. Bash FAQ
    3. Bash Guide
    4. Bash Reference Sheet
      Шпаргалка по частым синтаксическим оборотам.

 
Классическая учебная литература:
С одной стороны не упомянуть эти издания нельзя, с другой — они настолько устарели, что едва ли их можно рекомендовать в роли учебника.

 

Смело правьте и дополняйте шапку, однако не забывайте отписываться об исправлениях и сохранять исходный вариант под #.
Первый пост темы имел вид...

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 18:51 16-05-2008 | Исправлено: qw12, 09:42 24-03-2020
useretail



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
digital422

Цитата:
проверка на монтирование


Цитата:
if [ ! -d /tmp/test_arr/"${i}/${k}" ];

вот это и есть ваша проверка на монтирование
 
Добавлено:

Цитата:
mkdir -p /tmp/test_arr/"${i}/${k}";

вот это можно и не выполнять если монтируете

Всего записей: 4641 | Зарегистр. 14-09-2007 | Отправлено: 21:14 17-06-2023
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
digital42
 
Я как-то так понял описанные условия, потому что скрипт который Вы накидали я не понимаю к чему.
Код:
#!/bin/bash
 
function die() {
  local msg=${1:-FATAL ERROR}
  local code=${2:-1}
 
    echo -e "$msg" >&2
 
    exit "$code"
}
 
shopt -s nullglob
 
for type in import export; do
    for gorod in "$type"/gorod*; do
        if ! [[ -d $gorod ]]; then
            echo "WARNING: '$gorod' is not folder" >&2
            continue
        fi
 
        newdir="$(basename "$gorod")/$type"
 
        [[ -e $newdir ]] && continue
        mkdir -p "$newdir" \
            || die "FATAL: can't create dir: '$newdir'"
 
        mountpoint -q "$newdir" && continue
        mount -o bind "$gorod" "$newdir" \
            || die "FATAL: can't make mount bind: from '$gorod' to '$newdir'"
    done
done
пути у меня тут относительные а не абсолютные
ну и проверял я скрипт весьма условно

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 23:56 17-06-2023 | Исправлено: Alukardd, 18:49 18-06-2023
useretail



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Alukardd
имхо слишком мудреный у вас скрипт получился
mountpoint не нужен если папка отсутствует
 
Добавлено:
в конце скрипта не хватает shopt -u nullglob

Всего записей: 4641 | Зарегистр. 14-09-2007 | Отправлено: 00:04 18-06-2023
digital422

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
useretail
Про монтирование я имел ввиду что вставлю его потом.
 
Alukardd
Формат папок сейчас такой:
export/gorod1
export/gorod3
export/gorod19 и т.д
import/gorod1
import/gorod3
import/gorod19 и т.д
 
Сделал вот так:

Код:
 
    for i in "${array_gorod[@]}"; do
        for k in "${array_folder[@]}"; do
        if [ ! -d /tmp/test_arr/"${i}/${k}" ]; then mkdir -p /tmp/test_arr/"${i}/${k}"; fi
        done
    done
 
 

Всего записей: 354 | Зарегистр. 19-04-2003 | Отправлено: 07:44 18-06-2023
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
useretail
Цитата:
в конце скрипта не хватает shopt -u nullglob  
не нужно, это ж внутри скрипта

Цитата:
mountpoint не нужен если папка отсутствует
так до него и не дойдёт
 
digital422
я уже показал в целом завершённый пример с монтированием старого в новое.
Делать заранее массив array_gorod а не наполнять его динамически не очень как-то.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 18:48 18-06-2023
i81

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго дня, товарищи!
Помогите пожалуйста модифицировать скрипт:

Код:
#!/bin/bash
DIR1=/mnt/torrent/!!!Trans/AudioBook
DIR2=/mnt/torrent/!!!Trans/AudioBook_log
filecount=`find $DIR1 -type f | wc -l`
if [ $filecount -eq 0 ];
then
:
else
date=`date '+%d.%m'`
find $DIR1 -mtime +1 > $DIR2/$date.book.txt
find $DIR1 -mtime +1 -delete
fi
filecount=`find $DIR2 -name *.book.txt -mtime +124 | wc -l`
if [ $filecount -eq 0 ];
then
:
else
find $DIR2 -name *.book.txt -mtime +124 -delete
fi
exit

Сейчас он удаляет всё, что старше 1 дня. А нужно, что бы не трогал пустые папки, что бы только файлы удалял. Спасибо большое!

Всего записей: 329 | Зарегистр. 08-04-2006 | Отправлено: 14:23 10-07-2023
fscpsd



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
i81
Попробуйте вместо строки
Код:
find $DIR1 -mtime +1 -delete
использовать строку
Код:
find $DIR1 -mtime +1 -type f -delete  

Вроде должно сработать. Мне сейчас проверить негде, к сожалению.

Всего записей: 1854 | Зарегистр. 16-09-2010 | Отправлено: 14:53 10-07-2023 | Исправлено: fscpsd, 14:58 10-07-2023
i81

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Вроде должно сработать. Мне сейчас проверить негде, к сожалению.

Вроде работает. Подожду пару дней - проверю что с пустыми папками будет
Большое спасибо!

Всего записей: 329 | Зарегистр. 08-04-2006 | Отправлено: 16:30 10-07-2023 | Исправлено: i81, 16:30 10-07-2023
fscpsd



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
i81
Можете для проверки в той же строчке вместо
Код:
-mtime +1
указать
Код:
-mtime +0
или
Код:
-mtime 0
— тогда вычисляемое время сократится до 1 суток или 0 суток соответственно. Только осторожнее, если эти файлы вам ещё нужны, то лучше конечно в тестовой среде проверять.

Всего записей: 1854 | Зарегистр. 16-09-2010 | Отправлено: 05:05 11-07-2023 | Исправлено: fscpsd, 05:05 11-07-2023
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
i81
Я так же отмечу, что -mtime +1 сработает для файлов модифицированных сторого больше двух днеё назад, т.е. если файл менялся 47 часов назад, он не попадёт в фильтр +1.
Итого: "-mtime +1" не значит "больше 24 часов"

Цитата:
man find
When find figures out how many 24-hour periods ago the file was last accessed, any fractional part is  ignored,  so  to match -atime +1, a file has to have been accessed at least two days ago.


----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 15:41 27-07-2023 | Исправлено: Alukardd, 15:42 27-07-2023
i81

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Большие спасибо, товарищи, за помощь.
Работает всё как нужно теперь, директории не удаляет.
± один день в выборке для меня не принципиален.

Всего записей: 329 | Зарегистр. 08-04-2006 | Отправлено: 15:55 27-07-2023
aequit

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нужна функция на bash, выполняющая арифметическое округление. Не как в питоне - округление в сторону четного числа, а 0.5 должно округляться в 1, 0.25 в 0.3 а 2,5 в 3
Отбрасываемые 0,1,2,3,4 округляются вниз, а 5 и выше - вверх, вне зависимости от того, четное или нечетное число мы округляем.
Если есть такое, поделитесь, пожалуйста.

Всего записей: 192 | Зарегистр. 17-11-2005 | Отправлено: 15:05 03-08-2023 | Исправлено: aequit, 15:07 03-08-2023
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
aequit
В bash доступна только целочисленная арифметика, о каком округлении идёт речь? Если в результате операции деления есть дробная часть, то она просто отбрасывается.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 16:51 03-08-2023
aequit

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
только целочисленная арифметика

Не только. Вот примеры:
echo `LC_ALL=C printf "%.0f" 0.5`
echo "scale=0;1/2" | bc
python -c "print(round(.5, ))"
Результат  всех трёх команд  = 0   - неправильно!!!
 
Следующая команда даёт правильное округление:
echo '10.5' | awk '{ split($0, n, "."); print n[1] + (substr(n[2], 1, 1) >= 5 ? 1 : 0) }'
однако только до целого,  
нужно округлять десятичные дроби, хотелось бы одним аргументом передавать в функцию число, а вторым - количество требуемых знаков (до десятых, сотых или тысячных необходимо округление).
 
Может у кого есть готовое решение в закромах?

Всего записей: 192 | Зарегистр. 17-11-2005 | Отправлено: 17:20 03-08-2023
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
aequit
bc — не bash
0.5 — не записать в переменную как число
собственно python и awk тоже внешние утилиты

Цитата:
хотелось бы одним аргументом передавать в функцию число,
т.е. нужен просто функция-хак, которая примет строку (например "0.5") и на чистом bash без внешних утилит округлит его и вернёт строку (или уже можно и число) в виде целого числа? Я подчёркиваю что здесь 0.5 будет именно строкой, совершать математические (арифметические) операции bash умеет только с целыми числами.
 
Добавлено:
Если без доп проверок, то вот что-то такое вы ищете, видимо:
Код:
function round() {
  local f=$1
  [[ $f =~ ^-?[0-9]+.[0-9]+$ ]] && f="${f}1"
  LC_ALL=C printf "%.0f\n" "$f"
}

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

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 17:31 03-08-2023 | Исправлено: Alukardd, 17:11 09-08-2023
aequit

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Alukardd Спасибо. Самое полезное - информация о том, что 0.5 — не записать в переменную как число. Не задумывался и не обращал на это внимания.
Цели такой не стоит, именно на чистом bash без внешних утилит, просто ни одна из внешних утилит не работает, как нужно.
Придется допилингом заниматься с окостыливанием.

Всего записей: 192 | Зарегистр. 17-11-2005 | Отправлено: 10:28 04-08-2023
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
aequit
Цитата:
Придется допилингом заниматься с окостыливанием.
я же вроде накорябал функцию, которая округляет как Вы и хотели.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 12:35 04-08-2023 | Исправлено: Alukardd, 12:35 04-08-2023
aequit

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хотелось следующее: округлять десятичные дроби, одним аргументом передавать в функцию число, а вторым - количество требуемых знаков, которые требуется оставить (до десятых, сотых или тысячных необходимо округление).
 
Возьму Вашу функцию за основу и буду "придумывать" проверки и т.д.
Например, если в качестве аргумента подать целое число, выдает
echo `LC_ALL=C round 123`
Результат=1231
 
И ещё: я бы точку в паттерне регулярки экранировал, чтобы она не воспринималась как любой символ, а как литерал
[[ 1234a5 =~ ^-?[0-9]+.[0-9]+$ ]] && echo "True" || echo "False"
Результат=True  (неправильно!)
[[ 1234a5 =~ ^-?[0-9]+\.[0-9]+$ ]] && echo "True" || echo "False"
Результат=False
 
Логика видится такой (набросал себе план):
Определяем, является ли первый аргумент вообще числом - действия: выход с ошибкой если нет
Является ли первый аргумент целым числом - действия: выход с возвратом самого аргумента без изменений
Далее case в зависимости от второго аргумента 1, 2 или 3 знака после десятичной точки необходимо оставить. Больше знаков практически не потребуется.
Если второй аргумент равен 0 или отсутствует - округляем до целого.

Всего записей: 192 | Зарегистр. 17-11-2005 | Отправлено: 13:09 04-08-2023
Alukardd



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
aequit
Да, я там наглючил немного пока копировал туда-сюда. Экран нужен. Остальные проверки на Ваш вкус.
Зачем case? Просто второй аргумент подставить как переменную внутри формата printf. Логика с дописыванием 1 останется прежней. Если аргумента нет. делаем ноль. Ну и сам аргумент тоже проверяем.

----------
Microsoft gives you windows, linuх gives you the whole house...
I've been using Vim for about 4 years now, mostly because I can't figure out how to exit it.

Всего записей: 6563 | Зарегистр. 28-08-2008 | Отправлено: 14:03 04-08-2023
aequit

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всё-таки пришлось сделать по своему, для каждой требуемой точности округления своя строка. Может и существует вариант попроще, но ничего другого в голову не пришло:

Код:
#functions round
function round()
{
#Если аргумент 2 не передан, устанавливаем по умолчанию 0 знаков  
accuracy=${2:-0}
 
#Выбираем строку округления в зависимости от нужного количества знаков
case $accuracy in
   0) round=`echo $1 | awk '{ split($0, n, "."); print n[1] + (substr(n[2], 1, 1) >= 5 ? 1 : 0) }'`;;
   1) round=`echo $1 | awk '{ split($0, n, "."); a=(substr(n[2], 1, 1)); print n[1] + (substr(n[2], 2, 1) >= 5 ? (0.1+a*0.1) : (0+a*0.1)) }'`;;
   2) round=`echo $1 | awk '{ split($0, n, "."); a=(substr(n[2], 1, 1)); b=(substr(n[2], 2, 1)); print n[1] + (substr(n[2], 3, 1) >= 5 ? (0.01+a*0.1+b*0.01) : (0+a*0.1+b*0.01)) }'`;;
  3) round=`echo $1 | awk '{ split($0, n, "."); a=(substr(n[2], 1, 1)); b=(substr(n[2], 2, 1)); c=(substr(n[2], 3, 1)); print n[1] + (substr(n[2], 4, 1) >= 5 ? (0.001+a*0.1+b*0.01+c*0.001) : (0+a*0.1+b*0.01+c*0.001)) }'`;;
   *) round=`echo "Incorrect argument!"`;;
esac
 
echo $round
}
 

Применение:
round 123.55454545 3
результат:
123.555

Всего записей: 192 | Зарегистр. 17-11-2005 | Отправлено: 12:30 08-08-2023 | Исправлено: aequit, 12:35 08-08-2023
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153

Компьютерный форум Ru.Board » Операционные системы » UNIX » UNIX Shell: sh, bash, zsh; Coreutils и ко.; sed, awk, perl;


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru