NBash
100 строк · 3.1 Кб
1#!/bin/bash
2
3archivedir="$HOME/.deleted-files"
4realrm="$(which rm)"
5move="$(which mv)"
6dest=$(pwd)
7
8if [ ! -d $archivedir ] ; then
9echo "$0: Не найден каталог с удаленными файлами" >&2
10exit 1
11fi
12
13cd $archivedir
14
15# Если сценарий запущен без аргументов выводим список файлов
16if [ $# -eq 0 ] ; then
17echo "Содержимое архива удаленных файлов (отсортировано по дате):"
18ls | sed -e 's/\([[:digit:]][[:digit:]]\.\)\{4\}//g' \
19-e 's/\([[:digit:]][[:digit:]]\-\)//g'
20
21exit 0
22fi
23
24# Если пользователь задал шаблон для поиска.
25matches="$(ls -d *"$1" 2> /dev/null | wc -l)"
26
27if [ $matches -eq 0 ] ; then
28echo "Нет совпадений для \"$1\" в архиве удаленных." >&2
29exit 1
30fi
31
32if [ $matches -gt 1 ] ; then
33echo "Более одного совпадения в архиве:"
34index=1
35for name in $(ls -td *"$1")
36do
37datetime="$(echo $name | cut -c1-14 | awk -F. '{ print $5"/"$4" в "$3":"$2":"$1 }')"
38filename="$(echo $name | cut -c16-)"
39if [ -d $name ] ; then
40filecount="$(ls $name | wc -l | sed 's/[^[:digit:]]//g')"
41echo " $index) $filename (содержит = ${filecount} элементов, удалено = $datetime)"
42else
43size="$(ls -sdk1 $name | awk '{ print $1 }' )"
44echo " $index) $filename (размер = ${size}Кб, удалено = $datetime)"
45fi
46index=$(( $index + 1 ))
47done
48
49echo ""
50
51echo -n "Какую версию $1 вы желаете восстановить ('0' для выхода)? [1] : "
52read answer
53
54if [ ! -z "$(echo $answer | sed 's/[[:digit:]]//g')" ] ; then
55echo "$0: Восстановление отменено пользователем: неверный ввод." >&2
56exit 1
57fi
58
59if [ ${answer:=1} -ge $index ] ; then
60echo "$0: Восстановление отменено пользователем: выбран индекс больше максимального" >&2
61exit 1
62fi
63
64if [ $answer -lt 1 ] ; then
65echo "$0: Восстановление отменено пользователем" >&2
66exit 1
67fi
68
69restore="$(ls -td1 *"$1" | sed -n "${answer}p")"
70
71if [ -e "$dest/$1" ] ; then
72echo "\"$1\" уже существует в этом каталоге, невозможно перезаписать." >&2
73exit 1
74fi
75
76echo -n "Восстановление файла \"$1\" ... "
77$move "$restore" "$dest/$1"
78echo "Завершено."
79
80echo -n "Удалить остальные резервные копии файла из хранилища? [y] "
81read answer
82
83if [ ${answer:=y} = "y" ] ; then
84$realrm -rf *"$1"
85echo "Удалено."
86else
87echo "Оставшиеся резервные копии сохранены"
88fi
89else
90if [ -e "$dest/$1" ] ; then
91echo "\"$1\" уже существует в этом каталоге, невозможно перезаписать." >&2
92exit 1
93fi
94
95restore="$(ls -d *"$1")"
96
97echo -n "Восстановление файла \"$1\" ... "
98$move "$restore" "$dest/$1"
99echo "Завершено."
100fi