reorganizing
This commit is contained in:
+70
@@ -0,0 +1,70 @@
|
||||
import os
|
||||
import csv
|
||||
import shutil
|
||||
from collections import defaultdict
|
||||
|
||||
def find_duplicate_basenames(root_directory, valid_extensions):
|
||||
# Dictionary to store basenames and their corresponding file paths
|
||||
basenames_to_paths = defaultdict(list)
|
||||
|
||||
# Traverse the directory tree
|
||||
for dirpath, dirnames, filenames in os.walk(root_directory):
|
||||
for filename in filenames:
|
||||
full_path = os.path.join(dirpath, filename)
|
||||
basename, extension = os.path.splitext(filename)
|
||||
if extension.lower() in valid_extensions:
|
||||
basenames_to_paths[basename].append(full_path)
|
||||
|
||||
# Filter basenames with more than one file
|
||||
duplicate_basenames = {basename: paths for basename, paths in basenames_to_paths.items() if len(paths) > 1}
|
||||
|
||||
return duplicate_basenames
|
||||
|
||||
def get_file_size(path):
|
||||
try:
|
||||
return os.path.getsize(path)
|
||||
except OSError:
|
||||
return 0
|
||||
|
||||
def display_parent_levels(path, levels=2):
|
||||
# Display 'levels' parent directories above the file path
|
||||
components = path.split(os.sep)
|
||||
return os.sep.join(components[-levels:])
|
||||
|
||||
def prompt_user_for_selection(paths):
|
||||
print("Choose which file to keep:")
|
||||
for i, path in enumerate(paths, start=1):
|
||||
size_mb = get_file_size(path) / (1024 * 1024)
|
||||
print(f"{i}. {display_parent_levels(path)} ({size_mb:.2f} MB)")
|
||||
|
||||
while True:
|
||||
try:
|
||||
choice = int(input("Enter the number of the file to keep (or 0 to skip): "))
|
||||
if 0 <= choice <= len(paths):
|
||||
return choice
|
||||
else:
|
||||
print("Invalid choice. Please enter a valid number.")
|
||||
except ValueError:
|
||||
print("Invalid input. Please enter a number.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
server_directory = r"\\truenas\isolation\videos" # Replace with your server directory
|
||||
video_extensions = {".mp4", ".mkv", ".avi", ".mov"} # Add more video extensions if needed
|
||||
duplicate_files = find_duplicate_basenames(server_directory, video_extensions)
|
||||
|
||||
if duplicate_files:
|
||||
for basename, paths in duplicate_files.items():
|
||||
print(f"\nBasename: {basename}")
|
||||
choice = prompt_user_for_selection(paths)
|
||||
if choice == 0:
|
||||
print("Skipping this duplicate set.")
|
||||
else:
|
||||
# Keep the selected file and delete the others
|
||||
keep_path = paths[choice - 1]
|
||||
for path in paths:
|
||||
if path != keep_path:
|
||||
print(f"Deleting: {display_parent_levels(path)}")
|
||||
os.remove(path)
|
||||
print("\nDuplicate files processed.")
|
||||
else:
|
||||
print("No duplicate video files found.")
|
||||
Reference in New Issue
Block a user