Python-Skript, das den Inhalt zweier Verzeichnisse vergleicht

Motivation

Früher habe ich Daten von Aufzeichnungsmedien wie Digitalkameras und Action-Cams (USB-Speicher, SD-Karte usw.) auf eine andere externe SSD mit großer Kapazität kopiert und gespeichert, aber die verbleibende Menge der externen SSD geht zur Neige. .. Die externe SSD scheint doppelte Daten zu enthalten, daher möchte ich sie löschen. Es sind doppelte Dateien aufgetreten

――Nach dem Kopieren auf eine externe SSD habe ich sie hinzugefügt, bevor ich die Kopierquelldatei auf dem Aufzeichnungsmedium gelöscht und dann erneut gesichert habe.

Es scheint, dass die Ursache ist. Ich habe beschlossen, ein Skript zu schreiben, da es schwierig ist, den Inhalt der beiden Verzeichnisse zu überprüfen, ohne zwischen Groß- und Kleinschreibung zu unterscheiden.

Dateispeicher

Ausführungsbeispiel

Wenn Sie mit den beiden Verzeichnissen ausführen, die Sie als Argumente für jedes Unterverzeichnis, für jede Datei, jedes Verzeichnis und jeden symbolischen Link vergleichen möchten Vergleichen Sie den Zeitstempel mit der Dateigröße. Vergleichen Sie für Dateien gleicher Größe die Funktion filecmp.cmp (..., flat = False). Zeigen Sie das Ergebnis des Vergleichs mit dem folgenden Symbol vor dem Dateinamen an.

--Wenn sich im Vergleichsziel eine Datei mit demselben Namen befindet, repräsentiert das Symbol (>, =, <) den Zeitstempel (mtime) und das Symbol (++, - des Inhaltsvergleichsergebnisses" 3 Bytes kombinieren ,! = ,==, ,!!)

Zum Beispiel ist "===" "gleicher Zeitstempel und gleicher Inhalt", "> ++" ist "neuer und größer als die Datei mit demselben Namen in dem zu vergleichenden Verzeichnis" und "=! =" Ist "zu vergleichen". Der Zeitstempel und die Dateigröße sind identisch mit der Datei mit demselben Namen im Verzeichnis, aber der Inhalt (die Daten) sind unterschiedlich. " Im Fall einer symbolischen Verknüpfung ist '= (zwei leere Zeichen)' ein Symbol dafür, dass "der Zeitstempel und der Verbindungszielpfad identisch sind", und '= !!' ist ein Symbol dafür, dass "der Zeitstempel gleich ist, der Verbindungszielpfad jedoch unterschiedlich ist". Werden.

Ausführungsbeispiel


% ./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
(Auf halbem Weg weggelassen)
### 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
(Auf halbem Weg weggelassen)
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: !    : ~~
(Folgendes wird weggelassen)

Wenn Sie eine große Anzahl von Verzeichnissen und Dateien vergleichen möchten, können Sie doppelte Dateien leicht finden, indem Sie mit "./cmp_dirtree ./data0 ./data1 | grep -e". == "filtern. ..

Recommended Posts

Python-Skript, das den Inhalt zweier Verzeichnisse vergleicht
[Python] Ein Programm, das die Positionen von Kängurus vergleicht.
[Python] Ein Programm, das den Inhalt der Liste nach links dreht
[Python] Ein Programm, das die Anzahl der Täler zählt
Vorlage des Python-Skripts zum Lesen des Inhalts der Datei
[Maya Python] Crush den Inhalt des Skripts 2 ~ Liste Notizen
Ein Python-Skript, das die Anzahl der Jobs für eine bestimmte Bedingung von Indeed.com abruft
[Maya Python] Zerquetsche den Inhalt des Skripts 1 ~ Camera Speed Editor
Erstellen eines Python-Skripts, das die e-Stat-API unterstützt (Version 2)
Eine Reihe von Skriptdateien, die Wordcloud mit Python3 ausführen
Ich habe ein Skript geschrieben, das das Bild in zwei Teile teilt
Python-Skript, das den Status des Servers über den Browser überprüfen kann
Verarbeiten Sie den Inhalt der Datei der Reihe nach mit einem Shell-Skript
[Python, Ruby] Selen-Holen Sie sich Webseiteninhalte mit Webdriver
Ein Skript, das 0, 1 an die erste Python-Primzahl zurückgibt
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
Führen Sie den Python-Interpreter im Skript aus
[Python] [Meta] Ist der Python-Typ ein Typ?
Die Geschichte der Verarbeitung A von Blackjack (Python)
[Python] Ein Programm, das die Partitur rundet
[Python] Ein Programm, das die Anzahl der Schokoladensegmente berechnet, die die Bedingungen erfüllen
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
Aus einem Buch, das die Denkweise des Programmierers interessanterweise gelernt hat (Python)
[Python] Hinweis: Selbst erstellte Funktion zum Ermitteln des Bereichs der Normalverteilung
Holen Sie sich den Inhalt von Git Diff aus Python
Der Inhalt des Python-Tutorials (Kapitel 5) ist in einem Aufzählungszeichen zusammengefasst.
Der Inhalt des Python-Tutorials (Kapitel 4) ist in einem Aufzählungszeichen zusammengefasst.
Der Inhalt des Python-Tutorials (Kapitel 2) ist in einem Aufzählungszeichen zusammengefasst.
Holen Sie sich den Aufrufer einer Funktion in Python
Der Inhalt des Python-Tutorials (Kapitel 8) ist in einem Aufzählungszeichen zusammengefasst.
Der Inhalt des Python-Tutorials (Kapitel 1) ist in einem Aufzählungszeichen zusammengefasst.
Kopieren Sie die Liste in Python
Der Inhalt des Python-Tutorials (Kapitel 10) ist in einem Aufzählungszeichen zusammengefasst.
Schreiben Sie eine Notiz über die Python-Version von Python Virtualenv
"Python Kit", das Python-Skripte von Swift aufruft
[Python] Ein grobes Verständnis des Protokollierungsmoduls
Ausgabe in Form eines Python-Arrays
Der Inhalt des Python-Tutorials (Kapitel 6) ist in einem Aufzählungszeichen zusammengefasst.
Der Inhalt des Python-Tutorials (Kapitel 3) ist in einem Aufzählungszeichen zusammengefasst.
Berücksichtigung der Stärken und Schwächen von Python
[Python, PyPDF2] Ein Skript, das ein verbreitetes PDF in zwei links und rechts unterteilt
Python-Skript, das SQL-Dateien liest, BigQuery ausführt und CSV speichert
Rund um die Authentifizierung von PyDrive2, einem Paket zum Betreiben von Google Drive mit Python
[Python] Ein Programm, das die Anzahl der Aktualisierungen der höchsten und niedrigsten Datensätze berechnet
Python-Skript zum Abrufen einer Liste von Eingabebeispielen für den AtCoder-Wettbewerb
Ich habe ein Skript erstellt, das das aktive Fenster mit win32gui von Python aufzeichnet
der Zen von Python
Ein Skript, das eine Momentaufnahme eines EBS-Volumes erstellt
Erstellen Sie einen BOT, der die Discord-URL verkürzt
Python-Implementierung der Bayes'schen linearen Regressionsklasse
Holen Sie sich den Rückkehrcode eines Python-Skripts von bat
Python zeigt aus der Perspektive eines C-Sprachprogrammierers
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
Python, das viele Excel zu einem Excel zusammenführt
Den Inhalt der Daten in Python nicht kennen
Was ist in dieser Variablen (wenn das Python-Skript ausgeführt wird)?
Ein Skript, das eine Liste der Benutzer des SoftLayer-Portals ausgibt