Script Python qui compare le contenu de deux répertoires

Motivation

J'avais l'habitude de copier des données à partir de supports d'enregistrement tels que des appareils photo numériques et des caméras d'action (mémoire USB, carte SD, etc.) vers un autre SSD externe de grande capacité et les stocker, mais la quantité restante du SSD externe est faible. .. Il semble y avoir des données en double dans le SSD externe, je veux donc le supprimer. Des fichiers en double se sont produits

――Après avoir copié sur un SSD externe, je l'ai ajouté avant d'effacer le fichier source de la copie sur le support d'enregistrement, puis je l'ai de nouveau sauvegardé.

Il semble que la cause soit. J'ai décidé d'écrire un script car il est difficile de vérifier le contenu des deux répertoires sans être sensible à la casse.

Stockage de fichiers

Exemple d'exécution

Si vous exécutez avec les deux répertoires que vous souhaitez comparer comme arguments, pour chaque sous-répertoire, pour chaque fichier, répertoire et lien symbolique Comparez l'horodatage avec la taille du fichier. Pour les fichiers de même taille, comparez avec la fonction `` filecmp.cmp (..., shallow = False) ''. Affichez le résultat de la comparaison avec le symbole suivant devant le nom du fichier.

--S'il y a un fichier du même nom dans la cible de comparaison, le symbole (>, =, <) représentant l'horodatage (mtime) et le symbole (++, - 3 octets combinant ,! = ,==, ,!!)

Par exemple, === est "même horodatage et contenu", > ++ est "plus récent et plus volumineux que le fichier du même nom dans le répertoire à comparer", et =! = Est "à comparer". L'horodatage et la taille du fichier sont identiques à ceux du fichier du même nom dans le répertoire, mais le contenu (données) est différent. " Dans le cas d'un lien symbolique, «= (deux caractères vides)» est un symbole indiquant que «l'horodatage et le chemin de destination du lien sont identiques» et «= !!» est un symbole indiquant que «l'horodatage est le même mais le chemin de destination du lien est différent» Devenir.

Exemple d'exécution


% ./cmp_dirtree ./data0 ./data1
### ========================================
1: ./data0
2: ./data1
### ========================================
###-----------------< M4ROOT >--------------------
1: ./data0/M4ROOT
2: ./data1/M4ROOT
### Sub directories: ---
1:  =++ : 2019/02/09 12:43:35 :          952 : CLIP
2:  =-- : 2019/02/09 12:43:35 :          476 : CLIP
1:  === : 2019/02/09 12:43:35 :           68 : GENERAL
2:  === : 2019/02/09 12:43:35 :           68 : GENERAL
(Omis à mi-chemin)
### File lists: ---
1:  >== : 2019/11/05 03:47:45 :         6148 : .DS_Store
2:  <== : 2019/11/05 01:10:13 :         6148 : .DS_Store
1:  >++ : 2019/11/02 19:09:34 :         5122 : MEDIAPRO.XML
2:  <-- : 2019/07/01 19:07:35 :         2595 : MEDIAPRO.XML
1:  >== : 2019/11/02 19:09:34 :            7 : STATUS.BIN
2:  <== : 2019/07/01 19:07:35 :            7 : STATUS.BIN
###-----------------< M4ROOT/CLIP >--------------------
1: ./data0/M4ROOT/CLIP
2: ./data1/M4ROOT/CLIP
### File lists: ---
1:  === : 2019/02/09 14:53:23 :   1878686635 : C0001.MP4
2:  === : 2019/02/09 14:53:23 :   1878686635 : C0001.MP4
1:  === : 2019/02/09 14:53:23 :         2008 : C0001M01.XML
2:  === : 2019/02/09 14:53:23 :         2008 : C0001M01.XML
(Omis à mi-chemin)
1:  === : 2019/07/01 19:07:35 :   7627022896 : C0006.MP4
2:  === : 2019/07/01 19:07:35 :   7627022896 : C0006.MP4
1:  === : 2019/07/01 19:07:35 :         2009 : C0006M01.XML
2:  === : 2019/07/01 19:07:35 :         2009 : C0006M01.XML
1:      : 2019/07/28 14:15:53 :  15709053750 : C0007.MP4
2: !    : ~~
1:      : 2019/07/28 14:15:53 :         2008 : C0007M01.XML
2: !    : ~~
(Ce qui suit est omis)

Si vous avez un grand nombre de répertoires et de fichiers à comparer, vous pouvez facilement trouver les fichiers en double en filtrant avec `./cmp_dirtree ./data0 ./data1 | grep -e '. ==' ' ..

Recommended Posts

Script Python qui compare le contenu de deux répertoires
[Python] Un programme qui compare les positions des kangourous.
[Python] Un programme qui fait pivoter le contenu de la liste vers la gauche
[Python] Un programme qui compte le nombre de vallées
Modèle de script python pour lire le contenu du fichier
[Maya Python] Écraser le contenu du script 2 ~ list Notes
Un script python qui obtient le nombre de travaux pour une condition spécifiée sur Indeed.com
[Maya Python] Écraser le contenu du script 1 ~ Camera Speed Editor
Création d'un script Python prenant en charge l'API e-Stat (ver.2)
Un ensemble de fichiers de script qui font wordcloud avec Python3
J'ai écrit un script qui divise l'image en deux
Script Python qui peut vérifier l'état du serveur à partir du navigateur
Traitez le contenu du fichier dans l'ordre avec un script shell
[python, ruby] sélénium-Obtenez le contenu d'une page Web avec le pilote Web
Un script qui renvoie 0, 1 attaché au premier Python prime
[python] Une note que j'ai commencé à comprendre le comportement de matplotlib.pyplot
L'histoire de la création d'un module qui ignore le courrier avec python
Exécuter l'interpréteur Python dans le script
[python] [meta] Le type de python est-il un type?
L'histoire du traitement A du blackjack (python)
[Python] Un programme qui arrondit le score
[Python] Un programme qui calcule le nombre de segments de chocolat qui remplissent les conditions
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
D'un livre qui apprend de manière intéressante la façon de penser du programmeur (Python)
[Python] Note: Fonction auto-conçue pour trouver la zone de distribution normale
Récupérer le contenu de git diff depuis python
Le contenu du didacticiel Python (chapitre 5) est résumé dans une puce.
Le contenu du didacticiel Python (chapitre 4) est résumé dans une puce.
Le contenu du didacticiel Python (chapitre 2) est résumé dans une puce.
Récupérer l'appelant d'une fonction en Python
Le contenu du didacticiel Python (chapitre 8) est résumé dans une puce.
Le contenu du didacticiel Python (chapitre 1) est résumé dans une puce.
Copiez la liste en Python
Le contenu du didacticiel Python (chapitre 10) est résumé dans une puce.
Écrire une note sur la version python de python virtualenv
"Kit Python" qui appelle des scripts Python depuis Swift
[Python] Une compréhension approximative du module de journalisation
Sortie sous la forme d'un tableau python
Le contenu du didacticiel Python (chapitre 6) est résumé dans une puce.
Le contenu du didacticiel Python (chapitre 3) est résumé dans une puce.
Prise en compte des forces et faiblesses de Python
[Python, PyPDF2] Un script qui divise un PDF étalé en deux à gauche et à droite
Script Python qui lit les fichiers SQL, exécute BigQuery et enregistre le csv
Autour de l'authentification de PyDrive2, un package pour faire fonctionner Google Drive avec Python
[Python] Un programme qui calcule le nombre de mises à jour des enregistrements les plus élevés et les plus faibles
Script Python pour obtenir une liste d'exemples d'entrée pour le concours AtCoder
J'ai fait un script pour enregistrer la fenêtre active en utilisant win32gui de Python
le zen de Python
Un script qui prend un instantané d'un volume EBS
Créez un BOT qui raccourcit l'URL Discord
Implémentation python de la classe de régression linéaire bayésienne
Récupérer le code retour d'un script Python depuis bat
Points Python du point de vue d'un programmeur en langage C
#Une fonction qui renvoie le code de caractère d'une chaîne de caractères
Python qui fusionne beaucoup d'excellence en un seul Excel
Ne pas être conscient du contenu des données en python
Que contient cette variable (lorsque le script Python est en cours d'exécution)
Un script qui génère une liste d'utilisateurs du portail SoftLayer