Доброго времени суток. Рассмотрим копирование файлов с разных источников , но с одинаковыми названиями в путях.
Например у нас сервер приложений. Он хранит свои логи на 50 серверах и в какой то из приложений идет запрос и нужно просмотреть и сравнить логи. Для того, чтобы не подключаться к каждому серверу можно скачать и упаковать их в отдельные файлы(для передачи куда либо) , так как самому их просмотреть можно зайдя на ftp папку.
Для этого будем использовать Python
Этот код автоматизирует процесс копирования файлов из сетевых папок в локальный каталог и их архивации. Это также гарантирует уникальность имен файлов, добавляя цифру в конце исходного имени файла. в Файле srv.txt должны быть указаны путь до серверных расшаренных папок, без указания приложения, так как пользователь вводит его вручную.
```python
import os
import shutil
import zipfile
class Colors:
RED = '\033[31m'
END = '\033[m'
GREEN = '\033[32m'
YELLOW = '\033[33m'
BLUE = '\033[34m'
shares_file = r'C:\путь до файла\sltsrv.txt'
local_path = r'C:\logs'
network_shares = {}
with open(shares_file, "r") as f:
for i, line in enumerate(f):
share_path = line.strip()
share_name = f"share{i+1}"
network_shares[share_name] = share_path
file_date = input(Colors.GREEN + 'Введите дату ГГГГ-ММ-ДД: ' + Colors.END)
folder_name = input(Colors.BLUE + 'Введите само приложение (например, apiCalc): ' + Colors.END).strip() # тут мы вводим название приложения логи которого нам нужны
# тут идет выборка по всем серверам указанном в файле путь_дата_апп
# Начальное имя папки
target_folder = os.path.join(local_path, f"{file_date}_{folder_name}")
# Проверяем, есть ли папка с именем {date}_{folder_name}
if os.path.exists(target_folder):
# Если папка существует, создаем новую с добавлением _1, _2 и т.д.
i = 1
while True:
new_target_folder = f"{file_date}_{folder_name}_{i}"
new_target_folder_path = os.path.join(local_path, new_target_folder)
if not os.path.exists(new_target_folder_path):
target_folder = new_target_folder_path # Обновляем target_folder
break
i += 1
# Создаем папку (если ее еще нет), используя обновленное имя target_folder
os.makedirs(target_folder, exist_ok=True)
for share_name, share_path in network_shares.items():
source_folder = os.path.join(share_path, folder_name)
if os.path.exists(source_folder):
for file in os.listdir(source_folder):
if file.startswith(file_date):
source_path = os.path.join(source_folder, file)
share_short_name = share_path[2:13]
file_name, file_ext = os.path.splitext(file)
new_file_name = f"{share_short_name}_{file_name}{file_ext}"
local_file_path = os.path.join(target_folder, new_file_name)
shutil.copy2(source_path, local_file_path)
print(Colors.GREEN + f'Файл {file} успешно скопирован в папку {target_folder}' + Colors.END)
# Архивируем папку с именем {date}_{folder_name}
with zipfile.ZipFile(os.path.join(local_path, f'{file_date}_{folder_name}.zip'), "w") as zip_file:
for file in os.listdir(target_folder):
zip_file.write(os.path.join(target_folder, file), arcname=file, compress_type=zipfile.ZIP_DEFLATED)
else:
print(Colors.RED + f"Папка {folder_name} не найдена на шаре {share_name}" + Colors.END)
print(Colors.GREEN + f'Файлы успешно скопированы и запакованы в архив {file_date}_{folder_name}.zip' + Colors.END)
```
Само описание зачем это нужно
Этот код импортирует модули и определяет класс под названием "Colors", который содержит предопределенные цветовые коды для различных целей. В коде также определены две переменные: `shares_file`, которая представляет путь к файлу, содержащему общие сетевые ресурсы, и `local_path`, который представляет локальный путь, по которому будут храниться файлы.
Затем код считывает содержимое "shares_file" и создает словарь под названием "network_shares". Этот словарь сопоставляет имена сетевых ресурсов с соответствующими путями к ним.
Далее код предложит пользователю ввести дату в формате ГГГГ-ММ-ДД и название приложения, от которого требуются логи. Эти значения хранятся в переменных, называемых `file_date` и `folder_name`, соответственно.
Затем код проверяет, существует ли папка с именем `file_date_folder_name` в `local_path`. Если это так, код создает новую папку с уникальным именем, добавляя число в конце исходного имени папки. Этот процесс продолжается до тех пор, пока не будет найдено уникальное имя папки.(чтобы логи не записались в одну папку , если кто то еще попытается запустить скрипт)
Как только найдено уникальное имя папки, код создает папку и переходит к копированию файлов из общих сетевых папок в локальный каталог. Код просматривает каждую общую сетевую папку и проверяет, существует ли папка с таким же именем, что и у общего сетевого ресурса, в "исходной папке`. Если это произойдет, код скопирует все файлы из `source_folder` в `target_folder` и заменит имя файла уникальным именем папки.
Наконец, код архивирует все файлы в "целевой папке" в zip-файл с именем "file_date_folder_name.zip`.
Создание программки с кнопочками для этого скрипта рассмотрим потом.
Разработка программы с кнопками для скрипта.
Не много об установке самого Python тут