Files
2022-05-12 13:14:18 +08:00

105 lines
2.1 KiB
Python

#!/usr/bin/env python3
import pathlib
CURRENT_DIR = pathlib.Path(__file__).parent
ARCHIVE_DIR = CURRENT_DIR.joinpath("archive")
IGNORES = {
".idea/**",
"*.xml",
"*.iml",
".vscode/*",
".vscode/**/*",
"backup/*",
"backup/**/*",
__file__,
}
def filter_ignores(files):
keep = []
for file in files:
matched = any(
[file.match(ignore) or file.name.startswith(".") for ignore in IGNORES]
)
if not matched:
keep.append(file)
else:
print(f"[WARNING] ignore file: {file}")
return keep
def seek_files(path, recursive=False, ignore=True):
files = []
for file in path.iterdir():
if file.is_file():
files.append(file)
elif recursive and file.is_dir():
files.extend(seek_files(file, recursive))
if ignore:
files = filter_ignores(files)
return files
def extract_suffixes(files):
suffixes = set()
for file in files:
suffix = file.suffix
if not suffix:
continue
suffix = suffix.replace(".", "")
suffixes.add(suffix)
return suffixes
def groupby(files, suffixes):
group = {}
for file in files:
suffix = file.suffix.replace(".", "")
if suffix in suffixes:
group.setdefault(suffix, []).append(file)
else:
continue
return group
def classify(files, verbose=False):
suffixes = extract_suffixes(files)
grouper = groupby(files, suffixes)
if not grouper.keys():
return
for suffix, fs in grouper.items():
directory = ARCHIVE_DIR.joinpath(suffix)
directory.mkdir(parents=True, exist_ok=True)
if verbose:
print(f"[INFO ] handle .{suffix} files:")
for file in fs:
dest = directory.joinpath(file.name)
file.rename(dest)
if verbose:
print(f" change {file} -> {dest}")
def main():
path = CURRENT_DIR / "testdata"
print(f"Use current directory: {path}")
files = seek_files(path, recursive=True)
classify(files, verbose=True)
if __name__ == "__main__":
main()