66 lines
1.8 KiB
Python
Executable File
66 lines
1.8 KiB
Python
Executable File
#!/usr/bin/env python3.12
|
|
|
|
import argparse
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
|
|
def parse_args() -> argparse.Namespace:
|
|
parser = argparse.ArgumentParser(
|
|
description="Rename Gramps document files by appending extensions from a list."
|
|
)
|
|
parser.add_argument("directory", type=Path, help="Directory containing hashed files")
|
|
parser.add_argument("names_file", type=Path, help="Text file with target names")
|
|
return parser.parse_args()
|
|
|
|
|
|
def read_names(path: Path) -> list[str]:
|
|
if not path.is_file():
|
|
raise FileNotFoundError(f"Names file not found: {path}")
|
|
|
|
names = []
|
|
for line in path.read_text(encoding="utf-8").splitlines():
|
|
name = line.strip()
|
|
if name:
|
|
names.append(name)
|
|
return names
|
|
|
|
|
|
def rename_files(directory: Path, names: list[str]) -> None:
|
|
if not directory.is_dir():
|
|
raise NotADirectoryError(f"Directory not found: {directory}")
|
|
|
|
for name in names:
|
|
hash_part, dot, _ = name.partition(".")
|
|
if not dot:
|
|
print(f"Skipping invalid entry (missing extension): {name}", file=sys.stderr)
|
|
continue
|
|
|
|
source = directory / hash_part
|
|
target = directory / name
|
|
|
|
if target.exists():
|
|
print(f"Target already exists, skipping: {target}", file=sys.stderr)
|
|
continue
|
|
|
|
if not source.exists():
|
|
print(f"Source not found, skipping: {source}", file=sys.stderr)
|
|
continue
|
|
|
|
source.rename(target)
|
|
print(f"Renamed {source.name} -> {target.name}")
|
|
|
|
|
|
def main() -> None:
|
|
args = parse_args()
|
|
try:
|
|
names = read_names(args.names_file)
|
|
rename_files(args.directory, names)
|
|
except Exception as exc: # noqa: BLE001
|
|
print(str(exc), file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|