-
Notifications
You must be signed in to change notification settings - Fork 43
/
clear_upload.php
executable file
·105 lines (82 loc) · 4 KB
/
clear_upload.php
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
#!/usr/bin/env php
<?php set_time_limit(0);
if (count($argv) < 2) {
echo <<< USAGE
Usage: php clear_upload.php [--delete-files] [--move-files=/path/to] /path/to/document/root
Скрипт для очистки каталога upload/iblock от неиспользуемых файлов (оставшихся после удаления элемента инфоблока).
Проверяет каждый файл в каталоге upload/iblock, есть ли он в таблице b_file и если его там нет выводит полный
путь к нему на экран.
Если указана опция --move-file=/путь, то перемещает файл в указанную директорию с сохранением иерархии.
Если указана опция --delete-files, то удаляет файл. В режиме удаления (с опцией --delete-files),
если каталог, в котором находился удаляемый файл становится пустым - удаляет и его.
Примеры использования:
Получить список всех неиспользуемых файлов из каталога upload/iblock:
php clear_upload.php /var/www/example.com
Переместить все неиспользуемые файлы из каталога upload/iblock в папку /backup:
php clear_upload.php --move-files=/backup /var/www/example.com
Удалить все неиспользуемые файлы из каталога upload/iblock:
php clear_upload.php --delete-files /var/www/example.com
USAGE;
exit(0);
}
////////////////////////////////////////////////////////////////////////////////////////////
$command='';
$commandvalue='';
// Проверяем аргументы
if ( substr( $argv[1], 0, 2 ) === '--' ) {
$argv[1] = substr( $argv[1], 2 );
if (strpos($argv[1],'=')) {
list($command,$commandvalue) = explode("=",$argv[1],2);
} else {
$command = $argv[1];
}
}
$_SERVER['DOCUMENT_ROOT'] = $DOCUMENT_ROOT = count($argv) > 2 ? $argv[2] : $argv[1];
#define("LANG", "ru");
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);
$prolog = $_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php";
if (file_exists($prolog)) include($prolog); else die("Указанный каталог не является корневой директорией сайта на 1С-Битрикс" . PHP_EOL);
// Формируем кэш имен файлов на основе таблицы b_file.
$arFilesCache = array();
$result = $DB->Query('SELECT FILE_NAME, SUBDIR FROM b_file WHERE MODULE_ID = "iblock"');
while ($row = $result->Fetch()) {
$arFilesCache[ $row['FILE_NAME'] ] = $row['SUBDIR'];
}
$rootDirPath = $_SERVER['DOCUMENT_ROOT'] . "/upload/iblock";
$hRootDir = opendir($rootDirPath);
$count = 0;
while (false !== ($subDirName = readdir($hRootDir))) {
if ($subDirName == '.' || $subDirName == '..')
continue;
$subDirPath = "$rootDirPath/$subDirName";
$hSubDir = opendir($subDirPath);
while (false !== ($fileName = readdir($hSubDir))) {
if ($fileName == '.' || $fileName == '..')
continue;
if (array_key_exists($fileName, $arFilesCache)) {
continue;
}
$fullPath = "$subDirPath/$fileName";
if ($command=='delete-files') {
if (unlink($fullPath)) {
echo "Removed: " . $fullPath . PHP_EOL;
}
} elseif ($command=='move-files' && !empty($commandvalue)) {
mkdir("$commandvalue/$subDirName",0775, true);
if (rename($fullPath, "$commandvalue/$subDirName/$fileName")) {
echo "Move: " . $fullPath . PHP_EOL;
}
}
else {
echo $fullPath . PHP_EOL;
}
}
closedir($hSubDir);
if (!empty($command)) {
//delete empty directory
@rmdir($subDirPath);
}
}
closedir($hRootDir);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");