Wie füge ich mehreren Dateien Erweiterungen hinzu, indem ich den Inhalt jeder einzelnen Datei verwende?

Wie füge ich mehreren Dateien Erweiterungen hinzu, indem ich den Inhalt jeder einzelnen Datei verwende?

Ich habe über 10.000 Dateien, die keine Erweiterungen aus älteren Versionen des Mac OS haben. Sie sind extrem in der Dateistruktur verschachtelt und haben außerdem alle möglichen seltsamen Formatierungen und Zeichen. Sie haben keine Dateitypen oder Erstellercodes mehr. Viele dieser Dateien enthalten Text, mit dem ich Erweiterungen bestimmen kann (zum Beispiel steht Word.Document.8 im Text jeder Datei, die mit dieser Version von Word erstellt wurde).

Ich habe ein Skript gefunden, das anscheinend für jeweils einen dieser Dateitypen funktioniert, aber es löscht Teile des Dateinamens nach schädlichen Zeichen, was nicht gut ist.

find . -type f -not -name "*.*" -print0 |\
    xargs -0 file |\
    grep  'Word.Document.8' |\
    sed 's/:.*//' |\
    xargs -I % echo mv % %.doc

Soll ich zuerst die Zeichen in den Dateinamen bereinigen oder diese im Skript programmgesteuert bearbeiten, damit sie unverändert bleiben? Solange ich keine Informationen aus den Dateinamen verliere, sehe ich kein Problem darin, Schrägstriche und andere problematische Zeichen zu bereinigen. Wenn ich die Dateinamen bereinige, sind außerdem wahrscheinlich Duplikate vorhanden, sodass jedes Bereinigungsskript vor der Erweiterung etwas wie „-1“ hinzufügen müsste, um sicherzustellen, dass nichts verloren geht.

Ich bin nicht an dieses Skript gebunden, aber es ist verständlich, was ein Vorteil ist. Auf diesem Dateiserver ist Mac OS X 10.6 installiert, aber ich habe Zugriff auf alle neueren Versionen von OS X.

Antwort1

Ich bin immer noch nicht hundertprozentig sicher, ob ich die Frage verstehe, aber hier sind ein paar Gedanken.

  1. sed 's/:.*//'wird jeden Dateinamen verstümmeln, der einen Doppelpunkt enthält. Ist ein Doppelpunkt ein zulässiges Dateinamenzeichen auf dem Mac? Wenn nicht, ist das für Sie kein Problem. Andernfalls sollten Sie sed 's/: Word.Document.8$//'oder verwenden sed 's/: [^:]*$//'.
  2. Der mvvon erzeugte Befehl xargsscheint ein Problem zu sein. Versuchen Sie es mit
    xargs -I % sh -c 'echo mv "%" "%.doc"'.

Antwort2

Die zweite Frage lautet: Wie ändere ich das Skript, sodass es nach mehreren Dateitypen gleichzeitig sucht und jedem die richtige Erweiterung zuweist?

Hier sind ein paar Hinweise für den Anfang:

sed -e '/Word\.Dokument\.8/s/etwas/etwas anderes/;S/ein anderer/noch ein anderer/' \
    -e '/Excel\.Tabelle\.8/s/etwas 2/etwas anderes 2/;S/weitere 2/noch 2/' \
    ...

oder

awk '
      /Word\.Dokument\.8/ {
            awk-Befehle für Word
      }
      /Excel\.Tabelle\.8/ {
            awk-Befehle für Excel
      }
          
'

verwandte Informationen