feat: 新增Vol08章节示例源码
This commit is contained in:
0
code/08/backup/foo/bar.gz
Normal file
0
code/08/backup/foo/bar.gz
Normal file
0
code/08/backup/foo/bee.zip
Normal file
0
code/08/backup/foo/bee.zip
Normal file
0
code/08/backup/hello.py
Normal file
0
code/08/backup/hello.py
Normal file
0
code/08/backup/main.go
Normal file
0
code/08/backup/main.go
Normal file
0
code/08/backup/package.json
Normal file
0
code/08/backup/package.json
Normal file
0
code/08/backup/usage.py
Normal file
0
code/08/backup/usage.py
Normal file
104
code/08/main.py
Normal file
104
code/08/main.py
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
#!/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()
|
||||||
0
code/08/testdata/foo/bar.gz
vendored
Normal file
0
code/08/testdata/foo/bar.gz
vendored
Normal file
0
code/08/testdata/foo/bee.zip
vendored
Normal file
0
code/08/testdata/foo/bee.zip
vendored
Normal file
0
code/08/testdata/hello.py
vendored
Normal file
0
code/08/testdata/hello.py
vendored
Normal file
0
code/08/testdata/main.go
vendored
Normal file
0
code/08/testdata/main.go
vendored
Normal file
0
code/08/testdata/package.json
vendored
Normal file
0
code/08/testdata/package.json
vendored
Normal file
0
code/08/testdata/usage.py
vendored
Normal file
0
code/08/testdata/usage.py
vendored
Normal file
Reference in New Issue
Block a user