Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: как пофиксить бак в баше он создает пустой фалй. содзание файла .  (Прочитано 2690 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн livanda

  • Автор темы
  • Участник
  • *
  • Сообщений: 210
  • За мной будущее! А что за вами?
    • Просмотр профиля
    • Вка
Я написала скрипт, Скрит делат простую вешь он бепать нужные мне папки на нужные носители.
Еще раз повторяю при запуске скрипта скрит работает ХОРОШО, побишь он бекапит. броблема выявилась уже поже с пустя  месяца.  Он по какокйто причине создает пустой файл в директории со скриптом. Имя файла замер бакапа дикртории.


#!/bin/bash 

# Тут путь для какую папку бекапить не справшивает почему там массим мне так надо было -_-
ARREY_BACKUP=()
# Тут указать диретории  дисков или диретории куда стоит бекапить  можено несколько.
# Опять же мне для удобства
ARREY_TO_BACKUP_DIR=()

# тут как будет назваться с бекапом на диске или еще фиг занет где
# сртутура такая потмоу что я редко их редактирую и свой говна код.
# А так хобя буду занть что куда и что к чему.
BACKUP_NAME="my-scan-or-photo-doc.backup"
BACKUP_FOLDER=".Backup/"$BACKUP_NAME""


# Ниже идут массивы и содаение папко с проверкой дисков
# ничего интирченсого просто говна код. с повтором одного и тогоже
for DIR in ${ARREY_TO_BACKUP_DIR[@]} ; do
        LOG_ERROR=""$DIR"/"$BACKUP_FOLDER".ERROR.log"
        LOG=""$DIR"/"$BACKUP_FOLDER".log"
        df -h "$DIR" | grep "$DIR" &>/dev/null && \
                mkdir -p "$DIR"/"$BACKUP_FOLDER"


        for BACKUP in ${ARREY_BACKUP[@]} ; do




# Вот тут и появляется ошибка.
# Что делает ничежняя страка. Она сомтрит сколько места и где больше
# $(df  | grep "$DIR" | awk '{print $4}') На данном диске  больше места?
#  Чем у б директории $(du -s "$BACKUP" | awk '{print $1}') что я даелаю бекап.
# если ДА ЭТО ТАК. То выполняй бекап.
#
                if [ $(df  | grep "$DIR" | awk '{print $4}') > $(du -s "$BACKUP" | awk '{print $1}')  ] ; then
                    df "$DIR" | grep "$DIR" &>/dev/null  && \
                        ls "$BACKUP" &>/dev/null
                        rdiff-backup --force "$BACKUP" "$DIR"/"$BACKUP_FOLDER" 2>"$LOG_ERROR"  1>"$LOG"
                        rdiff-backup --remove-older-than 12M --force "$DIR"/"$BACKUP_FOLDER" 2>>"$LOG_ERROR"  1>>"$LOG"
# На ниже если НЕТ ЭТО НЕ ТАК. по чисти  сарый бекап и выходи из скрита.
                else [ $(df  | grep "$DIR" | awk '{print $4}') < $(du -s "$BACKUP" | awk '{print $1}')  ]
                        df -h "$DIR" | grep "$DIR" && echo -e "no space" 2>"$LOG_ERROR"  1>"$LOG"
                        df -h "$DIR" | grep "$DIR" && rdiff-backup --remove-older-than 1D --force "$DIR"/"$BACKUP_FOLDER" 2>>"$LOG_ERROR"  1>>"$LOG"
                fi #END
        done
done



по какойто причине вот эта часть кода du -s "$BACKUP" | awk '{print $1}' берет и создает файл с имением  размера папки  которая по  логике должна вообщето  с равнивать больше или меньше. Создавать файл ее ни кто не просит но файл создается




ВЕРСИЯ БАША
  bash --version
GNU bash, version 5.0.3(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
« Последнее редактирование: 13 Октября 2021, 20:03:31 от livanda »

Оффлайн ALiEN175

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5074
  • The truth is out there
    • Просмотр профиля
if [ $(df  | grep "$DIR" | awk '{print $4}') > $(du -s "$BACKUP" | awk '{print $1}')  ] ; then
...
else [ $(df  | grep "$DIR" | awk '{print $4}') < $(du -s "$BACKUP" | awk '{print $1}')  ]

if (( $(df | grep "$DIR" | awk '{print $4}') > $(du -s "$BACKUP" | awk '{print $1}') )) ; then
...
else (( $(df  | grep "$DIR" | awk '{print $4}') < $(du -s "$BACKUP" | awk '{print $1}')  ))

PS "[" - не является синтаксисом if (как это может показаться)! Это команда test
Для сравнивания цифровых значений используется (( или let

PPS
Цитировать
df "$DIR" | grep "$DIR" &>/dev/null  && "$BACKUP" &>/dev/null
Зачем?  :o
« Последнее редактирование: 13 Октября 2021, 20:59:47 от ALiEN175 »
ASUS P5K-C :: Intel Xeon E5450 :: 8 GB RAM :: Radeon R7 260X :: XFCE
SAMSUNG N150 :: Intel Atom N450 :: 2 GB RAM :: Intel GMA3150 :: XFCE

Оффлайн c47

  • Активист
  • *
  • Сообщений: 252
    • Просмотр профиля
ARREY
таки инглиш тоже не родной, как выяснилось))

по сути вопроса мне кажется, что скрипт берёт всё из нижеперечисленного
ls -la # a == показать скрытые файлы и директории
. # эта директория
.. # родительская директория для данной
/somefolder1
/somefolder2
somefile1
somefile2

надо сделать исключение "кроме .", увы нет ubuntu под рукой, протестить не могу, поэтому это лишь догадка
Не кормите тролля

Оффлайн ALiEN175

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5074
  • The truth is out there
    • Просмотр профиля
c47, не понял вас(
ASUS P5K-C :: Intel Xeon E5450 :: 8 GB RAM :: Radeon R7 260X :: XFCE
SAMSUNG N150 :: Intel Atom N450 :: 2 GB RAM :: Intel GMA3150 :: XFCE

Оффлайн livanda

  • Автор темы
  • Участник
  • *
  • Сообщений: 210
  • За мной будущее! А что за вами?
    • Просмотр профиля
    • Вка

PPS
Цитировать
df "$DIR" | grep "$DIR" &>/dev/null  && "$BACKUP" &>/dev/null
Зачем?  :o
Я аналогию этого скрита еще бекаплю и некоторы часть от рута. и чтобы он в пустую не создавал папки. или еще что-то делал. Скрипт перовереят df  подмонтированный ли диск или не. если подмонтированный то занчит выполняйся дальше если нет.  ???  у вас там еще ls  нет ls  старя такая же штука проверка на существования. Но это старя df  более эфективнее. аналогия сприта саря она перепиывалсь кучу раз.Вот такаих вот моих фиксов много. сейчас можно вообще простой проверкой написать. проблема в том что если я это сдлеалю у меня на каждую папку бекапы делают вот это с бекапов где лежат сканы докмунтов. А есть еще дириктория хом. если еще рабочаяя директория финасовая, есть еще просто с разыми проектами. короче их много и если я буду свой говоно код переписывать это займет много времни, а так роботает и все.  какой файл не открою код один и тотже мне его подеживать проще


Пользователь добавил сообщение 13 Октября 2021, 22:12:01:


PS "[" - не является синтаксисом if (как это может показаться)! Это команда test
Для сравнивания цифровых значений используется (( или let

Вы серьезно? а почему #!/bin/bash -x  не жалуется? или просто ошибку не пишет :o или это логическая?
« Последнее редактирование: 13 Октября 2021, 22:12:01 от livanda »

Оффлайн ALiEN175

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5074
  • The truth is out there
    • Просмотр профиля
Я аналогию этого скрита еще бекаплю и некоторы часть от рута. и чтобы он в пустую не создавал папки.
Так-то это не делает вообще ничего.
df "$DIR" | grep "$DIR" &>/dev/null  && "$BACKUP" &>/dev/null
^ df, OK
            ^ grep ничего не делает
                                     ^ не делаем ничего с grep, который ничего не делает

PS Тяжеловато вас читать, конечно.
ASUS P5K-C :: Intel Xeon E5450 :: 8 GB RAM :: Radeon R7 260X :: XFCE
SAMSUNG N150 :: Intel Atom N450 :: 2 GB RAM :: Intel GMA3150 :: XFCE

Оффлайн ALiEN175

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5074
  • The truth is out there
    • Просмотр профиля
Вы серьезно? а почему #!/bin/bash -x  не жалуется? или просто ошибку не пишет  или это логическая?
Пример без if. Просто скобки
$ [ 2 > 1 ] && echo OK || echo NO
OK
$ [ 2 < 1 ] && echo OK || echo NO
OK
$ (( 2 < 1 )) && echo OK || echo NO
NO
$ (( 2 > 1 )) && echo OK || echo NO
OK
-----------------------------------
$ ls 0
ls: не удалось выполнить ls для '0': Нет такого файла или каталога
$ [ $(echo 1) > $(echo 0) ] && echo OK || echo ERROR
OK
$ ls 0
0

Пример с if без скобок
$ echo 1234 > test.txt
$ grep 23 test.txt
1234
$ if grep 23 test.txt ; then echo OK ; else echo NOTFOUND; fi
1234
OK
# Обратите внимание, вывелось и 1234 из if, и OK из then
$ if grep -q 23 test.txt ; then echo OK ; else echo NOTFOUND; fi
OK
$ if grep 32 test.txt ; then echo OK ; else echo NOTFOUND; fi
NOTFOUND

Общий синтаксис
if СOMMAND
  then COMMAND
  else COMMAND
fi
« Последнее редактирование: 13 Октября 2021, 22:52:59 от ALiEN175 »
ASUS P5K-C :: Intel Xeon E5450 :: 8 GB RAM :: Radeon R7 260X :: XFCE
SAMSUNG N150 :: Intel Atom N450 :: 2 GB RAM :: Intel GMA3150 :: XFCE

Оффлайн livanda

  • Автор темы
  • Участник
  • *
  • Сообщений: 210
  • За мной будущее! А что за вами?
    • Просмотр профиля
    • Вка
c47,
 не поможет у меня du -s  покакойто причие содает файлы
ls [0-9]*
29225496  5248000  99372
Файлы эти пустые. почему он их создает? Он должен их получить зачение разера папки и их сравнить с свободным местом на диске он это длеат и длеате это хорошо но почему-то содает пустой фал с размером папки
 

Пользователь добавил сообщение 13 Октября 2021, 23:00:51:
Я аналогию этого скрита еще бекаплю и некоторы часть от рута. и чтобы он в пустую не создавал папки.
Так-то это не делает вообще ничего.
df "$DIR" | grep "$DIR" &>/dev/null  && "$BACKUP" &>/dev/null
^ df, OK
            ^ grep ничего не делает
                                     ^ не делаем ничего с grep, который ничего не делает

PS Тяжеловато вас читать, конечно.
| grep "$DIR"  вот это поянла.  а вот тут   && "$BACKUP" &>/dev/null должен ls  стоять

Пользователь добавил сообщение 13 Октября 2021, 23:07:30:
Вы серьезно? а почему #!/bin/bash -x  не жалуется? или просто ошибку не пишет  или это логическая?
Пример без if. Просто скобки
$ [ 2 > 1 ] && echo OK || echo NO
OK
$ [ 2 < 1 ] && echo OK || echo NO
OK
$ (( 2 < 1 )) && echo OK || echo NO
NO
$ (( 2 > 1 )) && echo OK || echo NO
OK
-----------------------------------
$ ls 0
ls: не удалось выполнить ls для '0': Нет такого файла или каталога
$ [ $(echo 1) > $(echo 0) ] && echo OK || echo ERROR
OK
$ ls 0
0

Пример с if без скобок
$ echo 1234 > test.txt
$ grep 23 test.txt
1234
$ if grep 23 test.txt ; then echo OK ; else echo NOTFOUND; fi
1234
OK
# Обратите внимание, вывелось и 1234 из if, и OK из then
$ if grep -q 23 test.txt ; then echo OK ; else echo NOTFOUND; fi
OK
$ if grep 32 test.txt ; then echo OK ; else echo NOTFOUND; fi
NOTFOUND

Общий синтаксис
if СOMMAND
  then COMMAND
  else COMMAND
fi


Ясно спасибо дошло сейчас буду sed  править эти проляте if  :-[ спасибо
« Последнее редактирование: 13 Октября 2021, 23:07:30 от livanda »

Оффлайн agtrif

  • Любитель
  • *
  • Сообщений: 60
    • Просмотр профиля
а также
do not use 'ls' in scripts

Оффлайн andytux

  • Старожил
  • *
  • Сообщений: 4911
    • Просмотр профиля
Цитировать
сейчас буду sed  править эти проляте if
Тогда-уж заодно, с кавычками у вас беда, например:
LOG_ERROR=""$DIR"/"$BACKUP_FOLDER".ERROR.log"Зачем этот лес кавычек, достаточно пары:
LOG_ERROR="${DIR}/${BACKUP_FOLDER}.ERROR.log"Фигурные скобки для большей совместимости и наглядности, можно и без них.

Оффлайн ALiEN175

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5074
  • The truth is out there
    • Просмотр профиля
andytux, и лес конвейеров. Я и сам когда-то также городил конструкции, кавычки, grep|sed|awk и тд :D
Ничего страшного. Пусть кавычки, пусть конвейеры. Главное - чтоб работало.
ASUS P5K-C :: Intel Xeon E5450 :: 8 GB RAM :: Radeon R7 260X :: XFCE
SAMSUNG N150 :: Intel Atom N450 :: 2 GB RAM :: Intel GMA3150 :: XFCE

Оффлайн andytux

  • Старожил
  • *
  • Сообщений: 4911
    • Просмотр профиля
Так-то оно так, но ведь не работает. Иначе, не было-бы вопроса. А эти "заросли" скрывают и запутывают реальную логику процесса.
Цитировать
вот эта часть кода du -s "$BACKUP" | awk '{print $1}' берет и создает файл
Немного "ширше":
> $(du -s "$BACKUP" | awk '{print $1}')Если вспомнить, то самый простой способ создания файла: "> file".

Оффлайн c47

  • Активист
  • *
  • Сообщений: 252
    • Просмотр профиля
c47, не понял вас(
(Нажмите, чтобы показать/скрыть)
Не кормите тролля

Оффлайн andytux

  • Старожил
  • *
  • Сообщений: 4911
    • Просмотр профиля
Продолжу насчет кавычек.
Казалось-бы что тут может случиться:
Цитировать
BACKUP_FOLDER=".Backup/"$BACKUP_NAME""
livanda, вы наверно предполагаете, что все выражение в кавычках. На самом деле в кавычках: ".Backup/" и "".
Например, если в $BACKUP_NAME будет пробел, то в переменную BACKUP_FOLDER попадет значение до пробела. Что натворит оставшийся "хвост", невозможно предположить.
И выловить эту ошибку будет непросто.

Оффлайн livanda

  • Автор темы
  • Участник
  • *
  • Сообщений: 210
  • За мной будущее! А что за вами?
    • Просмотр профиля
    • Вка
Продолжу насчет кавычек.
Казалось-бы что тут может случиться:
Цитировать
BACKUP_FOLDER=".Backup/"$BACKUP_NAME""
livanda, вы наверно предполагаете, что все выражение в кавычках. На самом деле в кавычках: ".Backup/" и "".
Например, если в $BACKUP_NAME будет пробел, то в переменную BACKUP_FOLDER попадет значение до пробела. Что натворит оставшийся "хвост", невозможно предположить.
И выловить эту ошибку будет непросто.

 Ну я эту проблему решила. Идиотским способом но решила.  Я все проблы заменила на _  вот этот символ и файлы что я создаю  и создают мои скрпиты делают так.  :'( это распалата за мой говно код еще с далеких 2007- 2008 годов когда я только начаилана его делать.  :-[ Я могла бы все переписать но я их много я про скрепты говорю так что просто под стороилась под это.А так заню  я уже сталкнулась с этим и давно.

Пользователь добавил сообщение 14 Октября 2021, 14:18:03:
c47, не понял вас(
(Нажмите, чтобы показать/скрыть)
Нет не глупость мой язык первый русски но он не основной.

Пользователь добавил сообщение 14 Октября 2021, 14:43:38:
andytux, и лес конвейеров. Я и сам когда-то также городил конструкции, кавычки, grep|sed|awk и тд :D
Ничего страшного. Пусть кавычки, пусть конвейеры. Главное - чтоб работало.
Вот вот.  :) Если вообще посмотерть на код что был мной и скорее тобой написан в начале. И ты не знал что это твой код то ты бы подумал что  :idiot2:   Я по этому и назваю свой код говна кодом потому что свой код спустя месяцы и годы я его так и вижу. Потому что мой уровевень вырос. Правлю его только в том случии если там большая партянка из более 50 строк или 100. Иначе смысла в этом нет. К примеру вот тут заметили про ARREY  :2funny: занли бы вы скаких годов это идет. А по соколько я срокчки кода просто копирую и вставляю я и не правлю потому инача совместимовсть моего говона кода сломается. И мне его подерживать сложнее будет.

Пользователь добавил сообщение 14 Октября 2021, 14:46:27:
Цитировать
сейчас буду sed  править эти проляте if
Тогда-уж заодно, с кавычками у вас беда, например:
LOG_ERROR=""$DIR"/"$BACKUP_FOLDER".ERROR.log"Зачем этот лес кавычек, достаточно пары:
LOG_ERROR="${DIR}/${BACKUP_FOLDER}.ERROR.log"Фигурные скобки для большей совместимости и наглядности, можно и без них.
Можно но они тут потому что еще изкакого-то мной скрипта взяты. окуда уже не помню. Но пока работает не птрогаю  ;) А если я буду sed массова править могу сломать что-то того плохо будет.
« Последнее редактирование: 14 Октября 2021, 14:46:27 от livanda »

 

Страница сгенерирована за 0.072 секунд. Запросов: 25.