-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlincentrator.sh
executable file
·127 lines (116 loc) · 5.05 KB
/
lincentrator.sh
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
122
123
124
125
126
127
#!/bin/bash
START=$(date +%s%N)
args=$@
helpme(){
if [ -z "$1" ];then
echo "Концентратор дубликатов."
echo "Делает все дубликаты каждого указанного файла мягкими ссылками на их оригиналы."
echo "Создаёт клон себя в данной папке и дописывает его по мере выполнения себя."
echo "Если выбрана мягкая ссылка, то сначала делает её оригинальным файлом."
echo "Если выбрано несколько одинаковых целей, то после первой другие игнорируются"
echo ""
echo "Использование: $(basename $0) ФАЙЛ [ФАЙЛ]..."
echo ""
exit
else
s="$0"; s=${s##*/}; s=${s%.*} #убираем путь и расширение нашего скрипта
if [ -s "$s".log ];then
echo "---------------------------------------------------------" >> "$s".log
echo "$(date +%x" "%X) Added by $s" >> "$s".log
if [ ! -z "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" ];then echo "Пути выбранных файлов в Caja:">>"$s".log; echo "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS">>"$s".log;fi
if [ ! -z "$NAUTILUS_SCRIPT_WINDOW_GEOMETRY" ];then echo "Геометрия окна:">>"$s".log; echo "$NAUTILUS_SCRIPT_WINDOW_GEOMETRY">>"$s".log;fi
if [ ! -z "$NAUTILUS_SCRIPT_NEXT_PANE_SELECTED_FILE_PATHS" ];then echo "Пути выбранных файлов на другой панели:">>"$s".log; echo "$NAUTILUS_SCRIPT_NEXT_PANE_SELECTED_FILE_PATHS">>"$s".log;fi
echo '$0='"$0">>"$s".log
echo '$s='"$s">>"$s".log
else
echo "$s log file, created by $s at $(date +%x" "%X)" >> "$s".log
fi
fi
}
pre_init(){
infile="$1"
cmd="md5sum" #чем делать сравнение
clone_postfix="_repeat" #как дописывать имя скрипта-клона
filhere="$(realpath -se --relative-to="$PWD" "$infile" 2>/dev/null)"
error_fnf="echo Файл $(basename "$infile") не найден!!!"
error_deadlink="echo $(basename "$infile") - битая ссылка на: '$(readlink "$infile")'"
}
init_script(){
#Основные переменные и создание/дополнение лога
filheregr=`echo "$filhere"|sed 's/ /\\\\s/g;s/^/\//g'` #имя файла для грепа
fil="$(realpath -s "$infile")"
filr="$(realpath "$infile")"
filsum=$($cmd "$filr"|sed 's/ .*//g')
echo '$infile='"$infile">>"$s".log
echo 'Относительный путь:' $filhere>>"$s".log
echo "Можно сделать так: '$0' '$filhere'">>"$s".log
echo "Команда была тут: '$0' '$args'">>"$s".log
}
make_orig(){
#Превращение симлинка в физический файл
if [ -h "$fil" ];then
unlink "$fil"
cp -f "$filr" "$fil"
echo "Для натурализации софтлинка '$fil' взяли оригинал '$filr'" >> "$s".log
echo "Теперь '$fil' - оригинал!" >> "$s".log
fi
}
link_dupes(){
#Превращение дубликатов в симлинки
echo "Создали софтлинки на '$fil'" >> "$s".log
$cmd ./* 2>/dev/null|grep "$filsum"|grep -Gv "$filheregr"$|sed -e 's/^[^ ]* *//g'|while read line; do
ln -srf "$infile" "$line"
echo "$line" >> "$s".log
done
}
clone_script(){
#Создание скрипта-клона
if [ -s "$s""$1".sh ];then
echo "" >> "$s""$1".sh
echo "#$(date +%x" "%X) Added by $s" >> "$s""$1".sh
else
echo "#!/bin/bash" >> "$s""$1".sh
echo "#$(date +%x" "%X) Generated by $s" >> "$s""$1".sh
chmod +x "$s""$1".sh
fi
echo 'filhere="'$filhere'"' >> "$s""$1".sh
echo 'fil="$(realpath -s '\"'$filhere'\"')" #было' "$fil" >> "$s""$1".sh
echo 'filr="$(realpath '\"'$filhere'\"')" #было' "$filr" >> "$s""$1".sh
echo 'cmd="'$cmd'"' >> "$s""$1".sh
echo "if [ -h \""'$fil'"\" ];then" >> "$s""$1".sh
echo " unlink \"\$filhere\"" >> "$s""$1".sh
echo " cp -f \""'$filr'"\" \""'$filhere'"\"" >> "$s""$1".sh
echo "fi" >> "$s""$1".sh
echo 'filsum=$($cmd "$filr"|sed '"'s/ .*//g'"') #было' "$filsum" >> "$s""$1".sh
echo "\$cmd ./* 2>/dev/null|grep "'$filsum'"|grep -Gv \""$filheregr"\"$|sed -e 's/^[^ ]* *//g'|while read line; do" >> "$s""$1".sh
echo 'ln -srf "$filhere" "$line"' >> "$s""$1".sh
echo "done" >> "$s""$1".sh
}
#BEGIN
helpme "$1"
for i in "$@"
do
pre_init "${i}"
if [ ! -z "$(find "$filhere" 2>/dev/null)" ];then #Если файл вообще есть (файл, ссылка, битая ссылка)
init_script
#ls -l "$infile"
if [[ "$allsums!" != *"$filsum"* ]];then
make_orig
link_dupes
# clone_script "$clone_postfix"
else
echo "$infile - файл(ы) с такой суммой уже есть в списке аргументов."
fi
allsums="$allsums $filsum"
elif [[ -z $(find -L "$infile" -type l 2>/dev/null) ]];then #Поиск среди софтлинков с таким именем ничего не дал
$error_fnf
else
$error_deadlink
fi
done
#echo "$allsums"
END=$(date +%s%N)
DIFF=$((($END - $START)/1000000))
echo ""
echo "Время выполнения: $DIFF мс" >> "$s".log
#EOF