-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathll2lpath
executable file
·121 lines (107 loc) · 3.41 KB
/
ll2lpath
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#! /bin/bash
# todo переписать все нахрен с использованием <dirent.h> и <sys/stat.h>
printhelp()
{
cat >&2 <<EOF
ll2lpath - сканирует текущий каталог
создает -p в нем папку .files/
а в ней файл с именем в виде даты времени
содержащий в каждой строчке
размер файла в байтах,
время создания файла в секундах с 1970 года
путь/имя файла
если в процессе сканирования возикли ошибки доступа или что-то в этом роде
он записывает это в файл с именем в виде даты времени-log
и сообщает "SAPID" (грязно)
EOF
exit $1
}
myecho(){
# echo "$@"
:
}
printargs(){
while [ $# -gt 0 ]; do
myecho "$1"
shift
done
}
myecho ll2lpath arguments:
printargs "$@"
[ "$1" == -h -o "$1" == --help ] && printhelp 0
if [ $# == 0 ]; then
wd=.files
mkdir -p "$wd"
else
wd="$1"
shift
mkdir -p "$wd"
if [ ! -s "$wd/dirconfig" ]; then
#на пустоту $@ не проверяем
while [ $# != 0 ]; do
printf ' "' >> "$wd/dirconfig"
printf "$1" | sed 's/\\/\\\\/g; s/\$/\\\$/g; s/"/\\"/g; s/`/\\`/g' >> "$wd/dirconfig"
shift
printf '"' >> "$wd/dirconfig"
done
fi
if [ -s "$wd/dirconfig" ]; then
args="$(cat "$wd/dirconfig")"
[ $# != 0 ] && [ "$(echo "$@")" != "$(eval echo "$args")" ] && {
echo директории "$wd" сопоставлены:
eval printargs "$args"
echo а запрашивается
printargs $@
exit 1
}
fi
fi
myecho "$wd"
myecho аргументы
eval printargs "$args"
#exit
datetime=$(date '+%F %H-%M-%S')
files="$wd/$datetime-files"
dirs="$wd/$datetime-dirs"
oldfiles="$(ls -1 "$wd"/20*-files "$wd"/19*-files "$wd"/21*-files 2>/dev/null | sort -r | head -n 1)"
olddirs="${oldfiles%-files}-dirs"
myecho files = "$files"
myecho dirs = "$dirs"
myecho oldfiles = "$oldfiles"
myecho olddirs = "$olddirs"
eval ls -alLR --time-style=+%s%N "$args" 2>"$wd"/ls-log | tee >(grep ':$' > "$wd"/last-dirs) |
runcpp ll2lpath-internal.c "$wd"/last-files "$wd"/log "$wd" .sync .git
#в "$wd"/last-dirs также будут попадать файлы, заканчивающиеся на :
[ "${PIPESTATUS[2]}" != 0 ] && exit 1
mv "$wd"/last-files "$files"
mv "$wd"/last-dirs "$dirs"
if
[ -e "$oldfiles" ] &&
myecho oldfiles exitst &&
[ -s "$oldfiles" ] &&
myecho and not empty &&
[ -e "$olddirs" ] &&
myecho olddirs exitst &&
[ -s "$olddirs" ] &&
myecho and not empty &&
[ $(ls -1 "$wd"/20*-files "$wd"/19*-files "$wd"/21*-files 2>/dev/null | wc -l) -gt 1 ] &&
myecho number of snapshots greater than 2 &&
[ "$(diff "$oldfiles" "$files")" == "" -a "$(diff "$olddirs" "$dirs")" == "" ]
then
rm "$files" "$dirs"
echo ничего нового
else
echo "$files" AND "$dirs" >> "$wd"/list
echo созданы "$files" "$dirs"
if [ -s "$oldfiles" -a -s "$olddirs" ] ; then
echo отличие от "$oldfiles":
diff "$oldfiles" "$files" -u0 | runcpp diffiles-internal.cpp
echo отличие от "$olddirs":
diff "$olddirs" "$dirs"
fi
fi
if [ -s "$wd"/log -o -s "$wd"/ls-log ]; then # -s - существует и не пуст
echo =============== SAPID =============
cat "$wd"/log "$wd"/ls-log | tee "$wd"/"$datetime"-log
fi
rm "$wd"/log "$wd"/ls-log