[PYTHON] "Stoppen Sie das Festschreiben japanischer Dateien für Git auf Mac> <" Vorerst habe ich ein Skript geschrieben, um nach inkompatiblen japanischen Dateien unter Mac und Linux zu suchen.

In meinem letzten PHP-Projekt schreibe ich Programme auf Japanisch. Nicht nur Klassennamen und Variablennamen, sondern auch Dateinamen sind auf Japanisch. (Ich möchte in einem separaten Artikel zusammenfassen, warum ich mich entschieden habe, auf Japanisch zu schreiben, und die Motivation dafür.)

In diesem Projekt ist die Entwicklungsumgebung Mac und die Produktionsumgebung Linux, es sind jedoch Probleme wie PHP aufgetreten, bei denen japanische Dateinamen nicht automatisch geladen wurden. Als ich es nachgeschlagen habe, war es, weil der Unicode-Standard zwischen dem Mac-Dateisystem und dem Linux-Dateisystem unterschiedlich war. Weitere Informationen finden Sie unter "Einführung Mania Dorafuto Edition: Hinweise zu Dateinamen unter Mac OS X (NFC, NFD usw.) ”Artikel wird hilfreich sein.

Um den Unterschied zwischen Dateisystemen kurz zu erklären,

Mac: Ein Standard namens NFD. Die Trübung und die Halbtrübung werden getrennt (normalisiert). "Da" wird zu 6 Bytes von "ta" und "" Linux: Ein Standard namens NFC. Trübung und Halbtrübung (Denormalisierung) nicht zerstreuen. "Da" wird zu 3 Bytes

Da ist ein Unterschied.

Wenn Sie die auf dem Mac erstellte NFD-Datei auf Git übertragen, wird sie im normalisierten Zustand wie sie ist bereitgestellt. Es wäre schön, wenn Sie es von NFD in NFC konvertieren könnten, wenn Sie es unter Linux ziehen, aber die Datei wird als NFD erstellt. Da der Quellcode von PHP NFC ist, tritt das Phänomen auf, dass "es auf einem Mac funktioniert hat, aber unter Linux nicht mehr funktioniert", wenn auf den Dateinamen fest verwiesen wird.

Es ist unvermeidlich, dass die japanische Datei festgeschrieben wurde. Um die problematische Datei vorerst zu identifizieren, habe ich in Python ein Skript erstellt, um die NFD-Datei herauszufinden.

Wie benutzt man

$ find-nfd -h
usage: find-nfd [-h] [path]

Find NFD files

positional arguments:
  path        path to find(Default: current working directory)

optional arguments:
  -h, --help  show this help message and exit

Quellcode

find-nfd.py


#!/usr/bin/env python
import os
import argparse
from unicodedata import normalize

def fild_all_files(directory):
    for root, dirs, files in os.walk(directory):
        yield root
        for file in files:
            yield os.path.join(root, file)

def to_nfc(string):
    string = string.decode("utf8")
    string = normalize("NFC", string)
    string = string.encode("utf8")
    return string

def is_nfd(string):
    if to_nfc(string) == string:
        return False
    else:
        return True

def find_nfd_files(directory):
    for file in fild_all_files(directory):
        if is_nfd(file):
            yield file

def main():
    parser = argparse.ArgumentParser(description="Find NFD files")
    parser.add_argument("path", type=str, help="path to find(Default: current working directory)", nargs='?', default=os.getcwd())
    args = parser.parse_args()

    count = 0

    for file in find_nfd_files(args.path):
        print file
        count += 1

    print ""
    print "%u files found" % (count)

if __name__ == "__main__":
    main()

Versuchen Sie es mit

Es ist eine Datei, die auf einem Mac ↓ erstellt wurde

$ php -r 'var_dump(glob("/tmp/test/1/*"));'
array(7) {
  [0] =>
  string(13) "/tmp/test/1/a"
  [1] =>
  string(13) "/tmp/test/1/b"
  [2] =>
  string(17) "/tmp/test/1/schon"
  [3] =>
  string(19) "/tmp/test/1/schön"
  [4] =>
  string(30) "/tmp/test/1/한글"
  [5] =>
  string(27) "/tmp/test/1/Hahifuheho"
  [6] =>
  string(42) "/tmp/test/1/Papipupepo"
}

Es ist völlig ununterscheidbar, ob es sich um NFD oder NFC handelt, aber Sie können sehen, dass die Anzahl der Zeichenfolgenbytes zwischen "Hahifuheho" und "Papipupepo" unterschiedlich ist. Sie können sehen, dass Umlaut auf Deutsch und Koreanisch auf Koreanisch ebenfalls NFD sind.

Suchen Sie nach der NFD-Datei in diesem:

$ find-nfd.py /tmp/test/1
/tmp/test/1/schön
/tmp/test/1/한글
/tmp/test/1/Papipupepo

3 files found

Ich habe drei gefunden.

Wenn Sie eine solche Datei finden, müssen Sie sie in einer Linux- oder Windows-Umgebung umbenennen und wieder in git einfügen.

Sie könnten gefragt werden: "Tun Sie dieses nervige Ding jedes Mal?", Aber wir ändern den Entwicklungsmechanismus selbst, so dass Vagrant in nur 5 Minuten eine Debian-Umgebung erstellen kann :)

Obwohl es sich um einen Mac handelt, handelt es sich nicht um eine Produktionsumgebung. Daher ist es wichtig, eine Entwicklungsumgebung zu erstellen, die genau der Produktionsumgebung entspricht, um unnötige Harmonie zu vermeiden.

Recommended Posts

"Stoppen Sie das Festschreiben japanischer Dateien für Git auf Mac> <" Vorerst habe ich ein Skript geschrieben, um nach inkompatiblen japanischen Dateien unter Mac und Linux zu suchen.
Ich möchte vorerst Selen bewegen [für Mac]
Ich möchte vorerst eine Docker-Datei erstellen.
AtCoder-Autor Ich habe ein Skript geschrieben, das Wettbewerbe für jeden Autor zusammenfasst
Ich habe Python zum ersten Mal auf dem Mac ausprobiert.
Versuchen Sie vorerst, Arch Linux zu installieren.
Suchen Sie unter Linux über die Befehlszeile nach großen Dateien
Ich habe vorerst versucht, PIFuHD unter Windows auszuführen
Ich möchte vorerst die Desktop-Umgebung von Ubuntu auf Android verwenden (Termux-Version)
Ich möchte vorerst Ubuntus Desktop-Umgebung auf Android verwenden (UserLAnd-Version)
Veröffentlichen Sie das erstellte Shell-Skript, um die Probleme beim Erstellen von LiveUSB unter Linux zu verringern
Ich habe eine Funktion erstellt, um zu überprüfen, ob der Webhook vorerst in Lambda empfangen wird
Ich möchte die Ausführungszeit aufzeichnen und ein Protokoll führen.
Ich habe gerade ein Skript geschrieben, um Android auf einem anderen Computer zu erstellen
Ich habe eine Funktion zum Laden des Git-Erweiterungsskripts in Python geschrieben
Ein Python-Skript, das auf dem Mac erstellte ._DS_Store- und ._ * -Dateien löscht
Ich habe ein Skript geschrieben, um goodnotes5 und Anki bei der Zusammenarbeit zu unterstützen
[Hi Py (Teil 1)] Ich möchte vorerst etwas machen, also setze zuerst ein Ziel.
Ich möchte die Desktop-Umgebung von Ubuntu vorerst auch unter Android verwenden (Termux-Version - japanische Eingabe in der Desktop-Umgebung).
Zur Zeit möchte ich mit FastAPI zeigen, wie man eine solche API in swagger verwendet
Ich habe versucht, die Wartezeit der Ausführungswarteschlange eines Prozesses unter Linux zu messen
Technik, um das Zeichnen des Bildschirms zu beenden und die Wartezeit für das Backen zu verkürzen
Ich möchte Linux auf dem Mac verwenden
Erstellen Sie mit RDKit einen Befehl zum Suchen nach ähnlichen Verbindungen aus der Zieldatenbank und überprüfen Sie die Verarbeitungszeit
Ich dachte, ich könnte einen netten Gitignore-Editor machen, also habe ich vorerst versucht, so etwas wie MVP zu machen
[Python] Ich habe ein Skript erstellt, das Dateien auf dem lokalen PC automatisch ausschneidet und auf eine externe SSD einfügt.
Ich möchte gleichzeitig einen Musik-Player erstellen und Musik ablegen
Ich habe ein Skript geschrieben, um die Schluckuhr wiederzubeleben, die bald sterben wird
Stellen Sie unter Linux (Ubuntu) das Trackpad ein und stellen Sie die Funktion auf Drei-Finger-Wischen ein
Machen Sie vorerst ein Histogramm (matplotlib)
Führen Sie yolov4 "vorerst" in Windows aus
Ich habe ein Skript geschrieben, um ein WordPress-Plug-In hochzuladen
Ich werde versuchen, die Links zusammenzufassen, die vorerst nützlich erscheinen
Bis Sie die Flask-Anwendung vorerst in Google App Engine ausführen
Ich möchte zum ersten Mal eine Django-Studie zur Mittagsdatenbank [EP1] erstellen
Ich möchte zum ersten Mal eine Django-Studie zum Mittagessen [EP1-4] erstellen
[Linux] Wenn Sie aus mehreren Dateien nach einer bestimmten Zeichenfolge suchen möchten
Eine Geschichte, als ich IntelliJ unter Linux verwendete und kein Japanisch eingeben konnte
Ein Python-Skript, das die Start- / Endzeit des Mac für die Anwesenheitsverwaltung verwenden möchte
Geben Sie die Lautstärke unter Linux an und spielen Sie den Sound ab
Flow Memo, um LOCUST vorerst zu verschieben
Erstellen Sie unter Linux einen QR-Code für die URL
Molekulardynamiksimulation vorerst versuchen
Ich habe Python zum ersten Mal mit Heroku ausprobiert
Ich habe ein automatisches Installationsskript für Arch Linux geschrieben
Neben Excel jupyter Notebook vorerst
Installierte die Retro-Game-Engine pyxel für Python auf dem Mac und startete den Beispielcode
So richten Sie WSL2 unter Windows 10 ein und erstellen eine Lernumgebung für Linux-Befehle
Ich möchte den Unterschied zwischen der for-Anweisung in der Python + numpy-Matrix und der Julia for-Anweisung auffangen
Geben Sie dem Befehl history ein Datum und eine Uhrzeit ein und sammeln Sie Verlaufsdateien aller Benutzer mit einem Skript
[Shell-Start] Ich habe versucht, die Shell mit einem billigen Linux-Board-G-Cluster auf dem Fernseher anzuzeigen
Ich habe versucht, ein Skript zu erstellen, das die Tweets eines bestimmten Benutzers auf Twitter verfolgt und das veröffentlichte Bild sofort speichert