So identifizieren Sie den Dateityp für eine große Menge von Dateien und fügen jeder eine geeignete Erweiterung hinzu

Ich habe etwas mehr als tausend (1000) Dateien, deren Suffix/Erweiterung von einer Datenbank-Engine alle auf dasselbe geändert wurden (z. B. Dateiname.abcd, wobei .abcd in jeder Datei steht, unabhängig davon, ob es sich um eine JPG-, PDF- oder was auch immer sonst).

Das Ziel ist es, alle Dateien in PDF zu konvertieren, aber ich möchte zuerst nur die verschiedenen Dateitypen in separate Ordner sortieren.

Ich verwende Mac OS X und stelle fest, dass es ein Terminal-Skript geben muss, das Folgendes tun würde:

  1. Identifizieren Sie die Datei (vielleicht mit dem Befehl 'Datei'?) und dann ...
  2. Hängen Sie die entsprechende Erweiterung an, die dann ...
  3. Gestatten Sie mir, sie je nach Dateityp manuell zu sortieren und in separaten Ordnern zur weiteren Verarbeitung abzulegen.

Bei Verwendung des Terminal-Befehls „Datei“ für eine Datei mit dem Datenbank-Suffix sind typische Ergebnisse ziemlich wortreich wie dieses, was zumindest zeigt, dass der Mac die Dateitypen identifizieren kann, obwohl sie die „falschen“ Suffixe haben:

  • JPEG-Bilddaten, JFIF-Standard 1.01
  • PDF-Dokument, Version 1.3
  • Daten im Rich-Text-Format, Version 1, ANSI
  • usw.

Ich brauche also nur ein Skript, das die Dateien markiert, damit ich Automator verwenden kann, um die Dateien später mit dem entsprechenden Suffix umzubenennen.

Ich stelle fest, dass, wenn ich in Terminal „Datei“ eingebe und danach mehrere Dateien darauf ablege oder kopiere und die Eingabetaste drücke, Terminal sie alle in derselben Reihenfolge korrekt identifiziert, aber es ist nicht nützlich, es sei denn, es markiert zumindest jeder Dateityp anders.

Ich denke, diese anfängliche Aufgabe ist zu schwierig für Automator, würde aber gerne widerlegt werden.

Jede Unterstützung dabei wäre willkommen. Ich habe dieses Board und andere Stellen überprüft und erwartet, dass jemand anderes ein ähnliches Problem hatte, aber ich habe nirgendwo ein solches Problem gefunden.

Antworten (1)

Dies ist ziemlich einfach, indem Sie einige Standardwerkzeuge kombinieren:

  • filezum Nachschlagen des Mime-Typs
  • trum die Schrägstriche zu entfernen (andernfalls hätten Sie verschachtelte Ordner für verschiedene Dateigruppen)
  • Nun, einige offensichtliche mkdirund mvBefehle
for file in *
do
    mime=$(file --brief --mime-type "$file" | tr '/' '_')
    mkdir -p "$mime"
    mv "$file" "$mime/$file"
done

Alternativ könnten Sie auch Dateierweiterungen für jeden erwarteten Mime-Typ direkt auflisten und automatisch entsprechend umbenennen.

for file in *
do
    mime=$(file --brief --mime-type "$file")

    case "$mime" in
    "image/jpeg")
        extension="jpeg"
        ;;
    "text/plain")
        extension="txt"
        ;;
    "application/pdf")
        extension="pdf"
        ;;
    *)
        continue;
        ;;
    esac

    filename="${file%.*}"

    mv "$file" "$filename.$extension"
done

Beachten Sie, dass ich aus Gründen der Lesbarkeit nicht auf Dateinamen geachtet habe, die Leerzeichen enthalten. Wenn Sie sie haben, müssen Sie eines der Muster anwenden, um mit Leerzeichen in Dateinamen umzugehen . Da es eher so aussieht, als hättest du sie nicht, habe ich sie weggelassen, da sie die Skripte viel komplizierter aussehen lassen, als sie sind.

Ich mag die Prämisse hinter Ihren Skripten, aber mit der ersten, wenn es Verzeichnisse in dem Verzeichnis gibt, in dem das Skript ausgeführt wird, werden sie auch verschoben, application_x-directoryund das ist meiner Meinung nach nicht gut. Es sollte so codiert werden, dass es keine Verzeichnisse verarbeitet. Sie bemerken auch "Beachten Sie, dass ich aus Gründen der Lesbarkeit nicht auf Dateinamen geachtet habe, die Leerzeichen enthalten." Ich finde jedoch, dass beide bei Dateinamen mit Leerzeichen richtig funktionieren.
Wenn Sie das Muster für Dateien anwenden, die Leerzeichen in dem von mir bereitgestellten Link enthalten, müssen Sie lediglich einen Filter hinzufügen, -type fum findVerzeichnisse auszuschließen.
Ich denke, Sie verfehlen den Punkt, in dem ersten Skript, das Sie Code gepostet haben, der von Natur aus gemäß dem OP fehlerhaft ist, um auf Dateien mit ungültigen Erweiterungen und nicht auf Verzeichnisse zu reagieren, und ein fehlerhaftes Skript bereitzustellen, während ein Link zur Behebung bereitgestellt wird, ist ein bisschen lächerlich. Hätten Sie einfach, auf meinen Vorschlag hin, etwas Ähnliches hinzugefügt, if [[ ! -d "$file" ]]; then ...hätte ich dafür gestimmt.
Danke Jens. Diese Antwort war noch besser, als ich erwartet hatte. Ich sollte dieses Terminal-Zeug wirklich lernen. Es scheint weitaus effizienter zu sein als jede GUI.
@user3439894 ist richtig: Es gibt absolut nichts zu tun, damit dies mit Dateinamen funktioniert, die Leerzeichen enthalten – es reicht aus, alle Verwendungen von zu maskieren, $filewie es die Beispielskripte tun (siehe die BashFAQ für Details darüber, warum dies so ist). Der relevante Absatz und Link müssen entfernt werden, da sie sowohl irrelevant als auch von der Antwort ablenken.