☰ Оглавление

Работа с данными: перемещение, переименование, архивирование

Удобное архивирование

Скрипт даёт архиву имя с датой, пытается добавить префикс, если файл с таким именем уже существует.

#!/bin/sh

clr0=`echo -e '\e[0m'`
clr1=`echo -e '\e[32m'`
clr2=`echo -e '\e[33m'`
clr3=`echo -e '\e[1m\e[31m'`

d=`date '+-%y-%m-%d'`
for arg in "$@"
do
  base=`basename "$arg"`
  dir=`dirname $arg`
  ok='not'
  for i in 0 1 2 3 4 5 6 7 8 9
  do
    if test "a$i" = "a0"
    then
      suff=''
    else
      suff="-$i"
    fi
    aname="$base$d$suff.tgz"
    if test -e "$aname"
    then
      echo "$clr2[INFO]$clr0 Left name \"$aname\""
    else
      tar -c -C "$dir" -z -f "$aname" "$base"
      if test "a$?" = 'a0'
      then
        echo "$clr1[OK]$clr0 $arg -> $aname"
      else
        echo "$clr3[ERROR]$clr0 Tar error for \"$arg\""
      fi
      ok='ok'
      break
    fi
  done
  if test "a$ok" = "anot"
  then
    echo "$clr3[ERROR]$clr0 Can not create name of archive for \"$arg\"!"
  fi
done

Найти файлы и архивировать их (получить список и архивировать по списку):

find . -type f -size -1000 | tar czv -T- -f file.tgz

Переименование: кодировка имён файлов

Рекурсивно обходит дерево и создаёт ещё одно дерево, которое повторяет оригинальное, но все сущности переименовываются в транслит.

function one_level_copy {
   sp="$1"
   tp="$2"
   mkdir "$tp"
   for i in *
   do
     j=`echo "$i" |
      iconv -f UTF-8 -t KOI8-R --byte-subst="<0x%x>" --unicode-subst='"' |
      translit`
     echo "j=$j"
     if test -d "$i"
     then
     (
        cd "$i"
        one_level_copy "../$sp/$i" "../$tp/$j"
     )
     else
       ln -s "$sp/$i" "$tp/$j"
     fi
   done
}
one_level_copy '../Fleur_UTF' '../Fleur_Translit'

Маленький скрипт для перекодирования в транслит:

#!/usr/local/bin/perl -p
chomp;
y/абвгдеёзийклмнопрстуфхъыьэ/abvgdeezijklmnoprstufh'y'e/;
y/АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЬЭ/ABVGDEEZIJKLMNOPRSTUFH'Y'E/;
s/ж/zh/g;
s/ц/ts/g;
s/ч/ch/g;
s/ш/sh/g;
s/щ/sch/g;
s/ю/ju/g;
s/я/ja/g;
s/Ж/Zh/g;
s/Ц/Ts/g;
s/Ч/Ch/g;
s/Щ/Sch/g;
s/Ю/Ju/g;
s/Я/Ja/g;
s/\s+/_/g;
s/[\177-\377]+/-/g;

Генерация md5-суммы

Для генерации md5-сумм существуют отдельные утилиты (под FreeBSD — md5, под Linux — md5sum), но они выдают информацию в разных форматах. openssl — более универсальный метод, работающий одинаково на всех платформах:

openssl md5 файл

FreeBSD/Linux md5/md5sum

Во FreeBSD и в Linux есть две утилиты для подсчёта md5-сумм файлов. Они выдают один а тот же результат, но в несколько разном формате, что очень неудобно, если надо сравнить файлы (по суммам), лежащие на Linux и FreeBSD машинах. Поэтому для каждой системы я написал маленький скрипт, имитирующий поведение недостающей утилиты.

Для FreeBSD — md5sum:

#!/bin/sh
md5 — "$@" | sed -E 's/^MD5 \((.*)\) = ([^[:space:]]+)/\2  \1/'

Для Linux — md5:

#!/bin/sh
md5sum — "$@" | sed -r 's/^(\S+)\s+(\S+)/MD5 (\2) = \1/'

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

Создание patch'ей

Создать patch:

diff старый_файл новый_файл > patch_файл

Наложить patch:

patch старый_файл patch_файл

Естественно порядок файлов везде важен.