The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Скрипт для конвертации архива gz в lzma
Скрипт для преобразования архива .gz в .lzma с сохранением времени
изменения/создания файла и прав доступа, а также с минимальным влиянием на производительность.
Для переименования группы файлов можно использовать конструкцию вида:

   find . -name "*.gz" -print0 | xargs -0 -n 1 echo ~/bin/gz2lzma.sh | batch

gz2lzma.sh:

#!/bin/sh
#
# CopyLeft (L) john_erohin, 2022
#
# gz2lzma.sh: convert .gz to .lzma with same mtime, ctime and access rights
# 
# in: $1 = file name with or without ".gz" suffix
# out: file "$1.lzma" and removed "$1.gz" if conversion is ok
#
# warining: if $1.lzma exist, it will be silently overwritten
#
# use someth like
# find . -name "*.gz" -print0 | xargs -0 -n 1 echo ~/bin/gz2lzma.sh | batch
# for mass background conversion
# 
F=$1
F=`echo $F | sed -e s:\.gz\$::g`

if [ -f $F.gz ] ; then
 /usr/bin/eatmydata -- \
  /usr/bin/nice -19 \
   /usr/bin/chrt --idle 0 \
    /usr/bin/ionice -c 3 \
      gzip -t $F.gz > /dev/null 2>&1
  RC=$?
  if [ $RC -ge 1 ]; then
    echo error $RC in $F.gz : integrity test failed
    exit $RC
  fi
  CTIME=`stat -c %w $F.gz`
  MTIME=`stat -c %y $F.gz`
  CHMOD=`stat -c %a $F.gz`
  TF=`mktemp`
  T=`basename $TF`
  rm $TF
  L=$F.$T.lzma
  touch $L
  chmod $CHMOD $L
  gzip -cdk $F.gz | \
    /usr/bin/eatmydata -- \
     /usr/bin/nice -19 \
      /usr/bin/chrt --idle 0 \
       /usr/bin/ionice -c 3 \
         /usr/bin/lzma -z9c > $L
  RC=$?
  if [ $RC -eq 0 ]; then 
    touch --date="$CTIME" $L
    touch -m --date="$MTIME" $L
    mv $L $F.lzma
    rm $F.gz 
  else
    echo lzma run-time error $RC processing $L
    exit $RC
  fi
else
  echo error: no input file $F or $F.gz
  exit 1
fi
 
23.02.2022 , Автор: john_erohin
Ключи: gz, lzma, ionice / Лицензия: CC-BY
Раздел:    Корень / Пользователю / Файлы, копирование, архивация

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, ABATAPA (ok), 18:44, 27/02/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +15 +/
    Привер того, как нельзя делать: переменные без кавычек, вызов внешних программ с  простой передачей им "голых" переменных (которые подставляются в exec), двойное раскодирование (сперва "тест", потом основное) вместо обработки кодов возврата...
    Корявый скрипт новичка.
     
  • 1.2, Аноним (2), 20:45, 28/02/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +7 +/
    соглашусь с предыдущим оратором. Автор, вбей свой скрипт в shellcheck.

    > Скрипт для конвертации архива gz в lzma

    что за задачка такая странная? Зачем это вообще нужно?

    > echo

    printf

    > if условие; then
    >   практически весь скрипт
    > else
    >   какой-то однострочный пустяк
    > fi

    просто проверь в самом начале на плохое условие и сделай ранний выход. Зачем весь скрипт помещать внутрь гигантского ифа?

    > /usr/bin

    не понимать, зачем универсальному кросс-дистровому скрипту хардкодить пути к бинарям. А если я захочу переопределить $PATH?

    > CopyLeft (L)

    Что за лицензия такая?

    > echo error: no input file $F or $F.gz
    > exit 1

    почему ошибки идут в stdout, а не в stderr?

    где стандартная преамбула, врубающая строгий режим? типа

        set -euo pipefail
        shopt -s inherit_errexit

    почему у переменных однобуквенные названия? да ты и сам спустя месяц забудешь, что они значат

    > if [ -f $F.gz ]

    че за бред, это не единственная IO-ошибка, которая может возникнуть. Об этих ошибках должна рапортовать вызываемая прога, а твое дело -- просто вовремя выходить и не глушить ее stdout/err.

     
     
  • 2.9, Омомо (?), 22:25, 03/03/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > set -euo pipefail
    > shopt -s inherit_errexit

    там в шебанге -- '/bin/sh', нет никакого pipefail.
    какой такой шопт? его тоже нет.

     
     
  • 3.11, john_erohin (?), 07:46, 04/03/2022 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > там в шебанге -- '/bin/sh', нет никакого pipefail.

    однако "set -e" есть.

    > какой такой шопт? его тоже нет.

    есть такие потребители смузей, что линкуют жырный bash на /bin/sh

     
     
  • 4.21, ммнюмнюмус (?), 02:30, 29/03/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Не знаю, как в gentoo, но в calculate по дефолту. А может и в gentoo тоже.
     
  • 4.42, ммнюмнюмус (?), 22:08, 19/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > есть такие потребители смузей, что линкуют жырный bash на /bin/sh

    А ещё у bash конвейеры передают быстрее, чем (внезапно) тот же dash, сам мерял.

     
  • 3.29, Аноним (29), 05:56, 03/04/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Пытаться сделать что-то с POSIX-шеллом сложнее hello world — бесполезная трата времени.

    Писать на баше это разумный и оптимальный подход, за исключением 3½ вырожденных случаев, которые ты за свою жизнь в дикой природе не встретишь, а если встретишь, то и там тоже будет баш.

     
     
  • 4.30, john_erohin (?), 05:50, 06/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > Пытаться сделать что-то с POSIX-шеллом сложнее hello world — бесполезная трата времени.

    на чистом /bin/sh - да, возможно.
    но зачем, если есть grep, sed и awk.

     
  • 4.34, Аноним (34), 03:31, 07/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Если что-то трудно изобразить на чистом шелле, то на баше получится урод еще покруче. Как раз 3.5 случая, когда башизмы хорошо ложатся. Лично мне проще писать на примитивном и простом как палка шелле, чем зазубривать все особенности баша.
     

  • 1.3, john_erohin (?), 21:43, 28/02/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • –5 +/
    > что за задачка такая странная? Зачем это вообще нужно?

    я хочу перепаковать. накопилось всякого в tar.gz, CPU и память есть.
    в дальнейшем переведу упаковку логов в lzma.

    >> echo
    > printf

    отказать. снижает читаемость.

    > Зачем весь скрипт помещать внутрь гигантского ифа?

    "структурное програмирование". слыхали про такую парадигму ?

    > зачем универсальному кросс-дистровому скрипту

    linux only. существенно используется

    https://www.opennet.ru/tips/3187_idle_cpulimit_limit_process_scheduler_linux.s

    > почему ошибки идут в stdout, а не в stderr?

    справделиво. я исправлю это.

    > где стандартная преамбула, врубающая строгий режим?

    в dash этого нет.

    и наконец:
    > > CopyLeft (L)
    > Что за лицензия такая?

    как копирайт, только наоборот. google it.

     
     
  • 2.4, Аноним (2), 07:55, 01/03/2022 [^] [^^] [^^^] [ответить]  
  • +3 +/
    echo не надежен, т к не дает универсального интерфейса для вывода самых разных... большой текст свёрнут, показать
     
     
  • 3.17, pavlinux (ok), 11:59, 26/03/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Например, выведи мне строку "-n".
    echo -e  '\b-n'
     
     
  • 4.22, ммнюмнюмус (?), 02:38, 29/03/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > Например, выведи мне строку "-n".
    > echo -e  '\b-n'

    А если переносимо, чтоб и на bash и на dash?
    Например, dash выдаст: -e-n

    В стандарте на posix shell вообще нет echo.

    printf '%s' "строка"  # Вполне читаемо

     
     
  • 5.23, pavlinux (ok), 12:24, 29/03/2022 [^] [^^] [^^^] [ответить]  
  • +/
    >> Например, выведи мне строку "-n".
    >> echo -e  '\b-n'
    > А если переносимо, чтоб и на bash и на dash?

    [ $SHELL == "dash" ] then
    [ $SHELL == "bash" ] then
    [ $SHELL == "mash" ] then
    [ $SHELL == "sash" ] then

    > Например, dash выдаст: -e-n

    [b]On XSI-conformant systems, if the first operand is -n, it shall be treated as a string,
    not an option. The following character sequences shall be recognized on XSI-conformant
    systems within any of the arguments:[/b]

    Так что, это ты пишешь не по стандарту, а не echo плохое.  :D

    > В стандарте на posix shell вообще нет echo.

    The Open Group Base Specifications Issue 7, 2018 edition
    IEEE Std 1003.1-2017 (Revision of IEEE Std 1003.1-2008)
    Copyright © 2001-2018 IEEE and The Open Group

    https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/

     
     
  • 6.24, ммнюмнюмус (?), 22:50, 31/03/2022 [^] [^^] [^^^] [ответить]  
  • +/
    >>> Например, выведи мне строку "-n".
    >>> echo -e  '\b-n'
    >> А если переносимо, чтоб и на bash и на dash?
    > [ $SHELL == "dash" ] then
    > [ $SHELL == "bash" ] then
    > [ $SHELL == "mash" ] then
    > [ $SHELL == "sash" ] then

    Кажется, вы предлагали echo для компактности. Все, гуляй компактность.

    >> Например, dash выдаст: -e-n
    > [b]On XSI-conformant systems, if the first operand is -n, it shall be
    > treated as a string,
    > not an option. The following character sequences shall be recognized on XSI-conformant
    > systems within any of the arguments:[/b]

    Прямо перед этим:
    > If the first operand is -n, or if any of the operands contain a <backslash> character, the results are implementation-defined.

    ===============
    > Так что, это ты пишешь не по стандарту, а не echo плохое.
    >  :D

    printf един, а у echo

    >APPLICATION USAGE
    > It is not possible to use echo portably across all POSIX systems unless both -n (as the first argument) and escape sequences are omitted.
    > The printf utility can be used portably to emulate any of the traditional behaviors of the echo utility as follows (assuming that IFS has its standard value or is unset):

    ================
    >> В стандарте на posix shell вообще нет echo.
    > The Open Group Base Specifications Issue 7, 2018 edition
    > IEEE Std 1003.1-2017 (Revision of IEEE Std 1003.1-2008)
    > Copyright © 2001-2018 IEEE and The Open Group
    > https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/

    Ну тогда уж сюда, а то еще раздел "Command language" искать.
    https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/utilities/echo.ht

    И то - сам стандарт прямо говорит, что переносимость у echo так себе. Вот делать нечего, как зачитывать все эти имена вместо одной строчки printf. Не та цель.

     
  • 3.47, echomaster (?), 20:58, 07/05/2022 [^] [^^] [^^^] [ответить]  
  • +/
    echo - -n
     
  • 2.6, Аноним (6), 20:03, 02/03/2022 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > хочу перепаковать .. в lzma

    zcat in.tar.gz | lzma > out.tar.xz

    Использования неименованного канала командной оболочки предотвращает передачу метаданных сжатого файла tar-архива. Но метаданные файлов внутри tar-архива хранятся в самом tar-архиве и сохраняются, он вообще не распаковывается.

    Так как и gzip, и xz (lzma) умеют сжимать только один файл, имеет смысл использовать их только в связке с tar, который обеспечит сохранность метаданных.

     
     
  • 3.7, Аноним (6), 20:04, 02/03/2022 [^] [^^] [^^^] [ответить]  
  • +/
    zcat in.tar.gz | lzma > out.tar.lzma


     
     
  • 4.12, john_erohin (?), 07:55, 04/03/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > zcat in.tar.gz | lzma > out.tar.lzma

    не все так хорошо.
    от использования cpulimit в tar.gz появился концевой мусор,
    поэтому придеься усложнить проверку:


    GZT='mktemp'

    /usr/bin/eatmydata -- \
      /usr/bin/nice -19 \
       /usr/bin/chrt --idle 0 \
        /usr/bin/ionice -c 3 \
          gzip -vt $F.gz > $GZT 2>&1
      RC=$?
      if [ $RC -ge 1 ]; then
        grep -q "decompression OK, trailing garbage ignored" $GZT
        if [ $? -eq 0 ]; then
          RC=0
        else
          echo error $RC in $F.gz : integrity test failed
          rm $GZT
          exit $RC
        fi
      fi


     
  • 2.8, Аноним (6), 20:09, 02/03/2022 [^] [^^] [^^^] [ответить]  
  • +2 +/
    А скрипт просто ужасен. Переменные без кавычек после rm и mv - верный путь удалить себе ноги или переместить их вместо рук.

    Надо так:
    mv -v -- "$F"
    rm -v -- "$F"

     
     
  • 3.33, Аноним (34), 03:19, 07/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Переменная проверяется до mv и rm, смысла нет засирать кавычками и флажками. Если что-то такое с пробелами в $F подсунуть, иф упадет.
    У вас просто догма - нужно все обкавычивать, как бы чего не вышло.
     
     
  • 4.36, Аноним (36), 12:23, 13/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Из каких конструкций можно понять, что переменная действительно проверяется до m... большой текст свёрнут, показать
     
  • 4.46, Аноним (46), 15:26, 28/04/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Переменная проверяется до mv и rm, смысла нет засирать кавычками и флажками.

    Дешёвые понты. "Засирать" - это как раз про такой говнокод, в котором нужно постоянно разбираться, что за чем проверялось. А двойные кавычки и EoO спасут ещё не один системный корень.

     
  • 2.14, Аноним (14), 15:59, 22/03/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Но зачем в устаревший lzma, а не в xz?
     
     
  • 3.18, john_erohin (?), 13:20, 26/03/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > Но зачем в устаревший lzma, а не в xz?

    по результатам тестов. у lzma лучше результаты на этой коллекции.

     
     
  • 4.53, Werwolf (ok), 12:24, 04/10/2022 [^] [^^] [^^^] [ответить]  
  • +/
    zstd пробовали?
     

  • 1.5, Аноним (5), 12:07, 02/03/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Мы всегда когда-то только учились.
     
  • 1.10, Омомо (?), 22:31, 03/03/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    "не нужно! этот ваш шелл нечитаемый. пишите на нормальных языках!"

    (я не знаю стандартные утилиты, не понимаю, зачем был сделан шелл, не знаю, что такое stdio и статус завершения процесса, пишу на питоне)

     
     
  • 2.25, ммнюмнюмус (?), 23:34, 31/03/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Выглядит как сарказм, зачем это минусовать.
     

  • 1.13, i (??), 01:29, 09/03/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Одно дело написать скриптец, чтобы он за вечерок перелопатил что-то, или за выходные, и совсем другое делать готовое решение, решение которое должно кроме защиты от инжектов включать защиты от двойного запуска, уметь определять когда оно было прервано, чтобы продолжать с нужного места, на баше это конечно делается, но настолько муторно, что проще переписать на чем-то вменяемом.
     
     
  • 2.15, Pavel (??), 16:04, 23/03/2022 [^] [^^] [^^^] [ответить]  
  • +/
    А чего тут муторного?

    PIDFILE="/run/myscript.pid"

    if [ -f "${PIDFILE}" ]; then
        pkill -0 -F "${PIDFILE}" \
        && echo "Script already run" \
        && exit 0 \
        || echo "Starting new instance"
    fi
    echo $$ > "${PIDFILE}"

     
     
  • 3.26, ммнюмнюмус (?), 23:37, 31/03/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > А чего тут муторного?
    > PIDFILE="/run/myscript.pid"
    > if [ -f "${PIDFILE}" ]; then
    >     pkill -0 -F "${PIDFILE}" \
    >     && echo "Script already run" \
    >     && exit 0 \
    >     || echo "Starting new instance"
    > fi
    > echo $$ > "${PIDFILE}"

    Если на полную катушку, то у шеллов (не только bash) должны быть стандартные пути для скриптов-библиотек, включая сами библиотеки. Вот это была бы моща.

     
     
  • 4.37, Аноним (36), 12:40, 13/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Так это делают: source /папка/файл

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

    Знания, что у каких-то топовых шелл 'set +e' будет принудительно сделан по POSIX при уровне вложенности более x (x=2, если верно помню), хоть бы и напишешь 'set -e'. И т.д. про '-o pipefail'. Что надёжные коды возврата из функций только строго беззнаковый байт.

    Что если при 'set -x' есть $0 и $LINENO внутри PS4, то в случае source сработает неудобно.

    Пространства имён переменных. Вот это всё про local, export... Проблемность глобальности переменных.

    Кодить можно, но есть другие более предназначенные для того инструменты.

     
     
  • 5.39, ммнюмнюмус (?), 16:16, 17/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > Знания, что у каких-то топовых шелл 'set +e' будет принудительно сделан по POSIX при уровне вложенности более x (x=2, если верно помню), хоть бы и напишешь 'set -e'

    А это точно есть в posix?
    posix-мануал для set про это ни слова (про опцию -e), да и слов force / nest там не найдено.

    По моему, если про это не сказано в стандарте, значит это против него).

     
  • 5.40, ммнюмнюмус (?), 16:32, 17/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    '-o pipefail' тоже не по posix
     
  • 3.28, ммнюмнюмус (?), 23:51, 31/03/2022 [^] [^^] [^^^] [ответить]  
  • +/
    # То же самое, но чуть более читаемо

    PIDFILE="/run/myscript.pid"

    if [ -f "${PIDFILE}" ] && pkill -0 -F "${PIDFILE}"; then
        echo "Script already run"
        exit 0
    fi
    echo "Starting new instance"
    echo $$ > "${PIDFILE}"

     
  • 3.32, Аноним (34), 03:06, 07/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > А чего тут муторного?
    > PIDFILE="/run/myscript.pid"
    > if [ -f "${PIDFILE}" ]; then
    >     pkill -0 -F "${PIDFILE}" \
    >     && echo "Script already run" \
    >     && exit 0 \
    >     || echo "Starting new instance"
    > fi
    > echo $$ > "${PIDFILE}"

    Вроде бы есть утилитка, которая нечто подобное реализует.

     

  • 1.16, pavlinux (ok), 11:45, 26/03/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    LZMA было модно лет 15 назад, ща ZSTD в тренде.  https://github.com/facebook/zstd
     
  • 1.19, pavlinux (ok), 18:30, 26/03/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > /usr/bin/nice -19 \
    > /usr/bin/chrt --idle 0 \
    > /usr/bin/ionice -c 3 \

    Дедовские методы и особо без гарантий.

    # mount -t cgroup -o all cgroup /sys/fs/cgroup;
    # mkdir /sys/fs/cgroup/$$
    # cd /sys/fs/cgroup/$$
    ...
    и понеслось рулить лимитами
    ...

     
     
  • 2.35, AntiSmoozer (?), 00:13, 11/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Смузи выпил?
     
  • 2.38, Аноним (36), 12:43, 13/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Так ведь у автора зато без sudo.
     
     
  • 3.43, pavlinux (ok), 11:30, 25/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > Так ведь у автора зато без sudo.

    Афтор - чайник, у него "/usr/bin/nice -19",
    он наверное не в курсе, что МИНУС 19 - это макс. приоритет в планировщике.  :D


    Не, ну мож наоборот, он гений. И вычислил, что комбинация: "nice -19, chrt --idle 0, ionice -c 3"
    даёт минимальный оверхэд. Типа в планировщике по-быстренькому отдуплился и дальше ждать ушёл.


    Но у меня такое ощщущенние, что это больше на DoS похоже.
    В планировщике задач будет часто появляться, при этом у таймера будет приоритет IDLE 0,
    но планировщик его не вытолкнет, будет ждать окончания ionice 3;

      

     
     
  • 4.48, john_erohin (?), 21:55, 12/05/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > Афтор - чайник, у него "/usr/bin/nice -19",
    > он наверное не в курсе, что МИНУС 19 - это макс. приоритет
    > в планировщике.  :D

    тонко !
    я даже начал сомневаться в себе. но потом проверил.

    0) есть builtin nice в разных шеллах, несовместимое внутри себя. а есть вот чего:

    $ file /usr/bin/nice

    /usr/bin/nice: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=2d64570259ee4ea90022ff7c87afbce7b6366f17, for GNU/Linux 3.2.0, stripped

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

    1) man top
    /NI
    13. NI  --  Nice Value
    The  nice  value  of  the  task.   A  negative  nice value means higher priority, whereas a
    positive nice value means lower priority.  Zero in this field simply  means  priority  will
    not be adjusted in determining a task's dispatch-ability.

    2) и вот представьте себе, процессы запущенные через "/usr/bin/nice -19"
    по данным top имеют NI = 19 (плюс 19),
    а треды ядра типа rcu* и mm* имеют NI = -20 (минус двадцать).

    что бы это значило ?

     
     
  • 5.49, pavlinux (ok), 17:07, 21/05/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Косяк это шелов и окружений (env), если nice -19 exec у тебя показывает наименьший,  
    то nice 19 exec не сможешь указать. Чтоб работало везде пиши: nice -n 19 или nice -n -19;

    > а треды ядра типа rcu* и mm* имеют NI = -20 (минус двадцать).
    > что бы это значило ?

    Это значит у них максимальный приоритет!!!

     
     
  • 6.50, john_erohin (?), 22:17, 10/06/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > Чтоб работало везде пиши: nice -n 19 или nice -n -19;

    отказать. чтобы работало везде надо вызывать /usr/bin/nice именно так как написано.

     

  • 1.41, Ano (?), 17:04, 18/04/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Скрипт прочтения man gz lzma bash
     
  • 1.44, pavlinux (ok), 12:23, 25/04/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/



    #!/bin/bash
    #
    # перед стартом проверить наличие find, file, rename, stat, chmod, chown, touch, zcat, lzma, ...

    for d in $(find -noleaf -xdev -type d)
       do
          pushd .;
          cd $d
          for i in $(ls -1 *[gG][zZ]); # .tgz, .GZ тоже бывают.
             do
               if [ "$(file --mime-type $i|cut -d' ' -f2)" != "application/gzip" ];
                  then
                       continue;
               fi
               # тут должно быть определение прав доступа на (запись, chmod/chown оригинала)
               zcat $i | lzma -cz9 > $i.lzma;
               touch -a -d "'stat -c '%x' $i'" $i.lzma;
               touch -m -d "'stat -c '%y' $i'" $i.lzma;
               chown "'stat --printf '%u:%g' $i'" $i.lzma;
               chmod "'stat -c '%a' $i'" $i.lzma;
               rename 's/gz.lzma/lzma/' $i.lzma
               rm $i;
           done;
          popd;
    done



     
     
  • 2.45, Аноним (46), 15:18, 28/04/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > if [ "$(file --mime-type $i|cut -d' ' -f2)" != "application/gzip" ]; then continue; fi

    case "$(env LC_ALL=C file --mime-type --brief -- "${i}")" in application/gzip) continue ;; esac

     
  • 2.51, другой Аноним (?), 14:02, 25/06/2022 [^] [^^] [^^^] [ответить]  
  • +/
    [~/src]:$ file --ver
    file-5.33
    magic file from /etc/magic:/usr/share/misc/magic

    [~/src]:$ file --mime-type gpu_burn-0.4.tar.gz
    gpu_burn-0.4.tar.gz: application/x-gzip

    --

    надо бы ещё проверять, а все ли утилиты файл возвращают application/gzip или кто-то application/x-gzip?

     
     
  • 3.52, pavlinux (ok), 19:12, 20/07/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > надо бы ещё проверять, а все ли

    Я тож считают, что за время гемора в разработке этого скрипта,
    можно было заработать на покупку 100Tb SSD. Это к вопросу об экономии места.  

    Портабельность тут почти на нуле. Напр. на SCO UNIX иль IRIX 7 не взлетит.
    Не полетит на busybox-based дистрах, в Андроидах, скорее всего с BSD до 9 будут проблемы...


    Для универсальности надо либо писать на ANSI C89/C++98/Perl 2.0/Python2,  
    либо тестить скрипты в csh на FreeBSD/NetBSD версий 1997-2000 годов.


     


     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Спонсоры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2022 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру