Скрипт даёт архиву имя с датой, пытается добавить префикс, если файл с таким именем уже существует.
#!/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-сумм существуют отдельные утилиты
(под FreeBSD — md5
, под Linux — md5sum
), но они
выдают информацию в разных форматах. openssl — более
универсальный метод, работающий одинаково на всех платформах:
openssl md5 файл
Во 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:
diff старый_файл новый_файл > patch_файл
Наложить patch:
patch старый_файл patch_файл
Естественно порядок файлов везде важен.