Skip to content

Instantly share code, notes, and snippets.

@Mossuru777
Created March 23, 2020 05:38
Show Gist options
  • Save Mossuru777/f0a0f164092aac29b8675e91ed401ac2 to your computer and use it in GitHub Desktop.
Save Mossuru777/f0a0f164092aac29b8675e91ed401ac2 to your computer and use it in GitHub Desktop.
同じファイル名で拡張子が異なるファイルを抽出or削除
# -*- coding: utf-8 -*-
"""
ファイル名が同じJPEG/HEICファイルを抽出して別ディレクトリに移動する
https://qiita.com/shamoji/items/cd5736649b577a756926 をもとに作成しました
"""
from datetime import datetime, timedelta, timezone
import itertools
import os
from pathlib import Path
import shutil
# 探索するディレクトリ
find_dir = "./images"
def main():
# Pathオブジェクトを生成
current = Path(find_dir)
# ファイル一覧を保存するdict
files_dict = {}
# ファイル名をキーとして辞書型に格納する
for f in itertools.chain(current.glob("*.jpg"), current.glob("*.heic")):
# フルパスから拡張子を除いたファイル名を取得
f_resolved = f.resolve()
file_path_without_ext = f_resolved.parent.joinpath(f_resolved.stem)
# これをキーとしてdictに追加していく
files_dict.setdefault(file_path_without_ext, []).append(f_resolved)
# 重複ファイル一覧を保存するlist
dup_files = []
# dictに登録されたリストのサイズが2の場合、重複であるとして抽出する
dup_files = [v for k, v in files_dict.items() if len(v) == 2]
# 同ファイル名のJPEG/HEICファイルをdupsディレクトリに移動
for pathes in dup_files:
for path in pathes:
if new_dir is None:
# dupsディレクトリが存在しない場合は作成する
new_dir = str(path.parent.joinpath("dups"))
os.makedirs(new_dir, exist_ok=True)
shutil.move(str(path), new_dir)
# 抽出・移動ファイル数出力
dup_pairs = len(dup_files)
if dup_pairs > 0:
print(f"*** {new_dir} に {dup_pairs} の同ファイル名JPEG/HEICファイルペアを移動しました ***")
else:
print(f"*** {current} に対象の同ファイル名JPEG/HEICファイルペアは見つかりませんでした ***")
if __name__ == "__main__":
main()
# -*- coding: utf-8 -*-
"""
dup_find.pyを実行してdupsディレクトリ以下の重複ファイルであるかを自分で確認した後、
ファイル名が同じJPEG/HEICファイルのJPEGファイルを削除し、HEICファイルを1つ上位ディレクトリに移動する
https://qiita.com/shamoji/items/cd5736649b577a756926 をもとに作成しました
"""
from datetime import datetime, timedelta, timezone
import itertools
import os
from pathlib import Path
import shutil
# dup_find.pyで指定した探索時ディレクトリ (dupsは含まないでOK)
find_dir = "./images"
def main():
# Pathオブジェクトを生成
current = Path(find_dir).joinpath("dups")
if not current.exists():
print(f"*** {current} が存在しません ***")
return
# ファイル一覧を保存するdict
files_dict = {}
# ファイル名をキーとして辞書型に格納する
for f in itertools.chain(current.glob("*.jpg"), current.glob("*.heic")):
# フルパスから拡張子を除いたファイル名を取得
f_resolved = f.resolve()
file_path_without_ext = f_resolved.parent.joinpath(f_resolved.stem)
# これをキーとしてdictに追加していく
files_dict.setdefault(file_path_without_ext, []).append(f_resolved)
# 重複ファイル一覧を保存するlist
dup_files = []
# dictに登録されたリストのサイズが2の場合、重複であるとして抽出する
dup_files = [v for k, v in files_dict.items() if len(v) == 2]
# JPEGファイルを削除し、HEICファイルを1つ上位のディレクトリに移動する
for pathes in dup_files:
for path in pathes:
if path.suffix == ".jpg":
os.remove(str(path))
else:
original_dir = str(path.parent.parent)
shutil.move(str(path), original_dir)
# dupsディレクトリが空なら削除、それ以外は孤立ファイル数を出力
after_proc_files = len(list(current.glob("*.*")))
str_current = str(current)
if after_proc_files == 0:
os.rmdir(str_current)
else:
print(f"*** {str_current} に {after_proc_files} 個のファイルがあるため、削除しませんでした ***")
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment