105 lines
2.1 KiB
Python
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()
|