Ordneraktion für die automatische Dateinamenbereinigung

Ich möchte eine Ordneraktion erstellen, die die Dateinamen meiner heruntergeladenen Dateien bereinigt.

Beispielsweise sollte Youtube_MyVideofile_(1080p_30fps_H264-128kbit_AAC).mp4 durch „Youtube“ „30fps“ „128kbit“ „AAC“ „(“ „)“ und „_“ durch ein „Leerzeichen“ ersetzt werden. Das Ergebnis wäre also MyVideofile 1080p H264.mp4

Ich weiß, dass ich das mit Automator machen könnte, aber dann muss ich für jedes Wort ein "Suchen/Ersetzen"-Element einrichten. Ich würde lieber eine einzige Liste von Wörtern verwenden, die einfacher zu pflegen wäre, da ich viele verschiedene Quellen habe, aus denen ich regelmäßig Dateien erhalte, sodass die tatsächliche Liste der zu entfernenden Wörter sehr lang sein wird und werden kann von Zeit zu Zeit aktualisiert.

Ich habe diesen Automator oder AppleScript gefunden, um mehrere Zeichenfolgen aus Dateinamen zu entfernen? das ist ähnlich, aber es funktionierte nur mit ausgewählten Ordnern. Stattdessen möchte ich es so einrichten, dass es automatisch als Ordneraktion funktioniert.

Ich denke, deshalb brauche ich auch eine Whitelist mit Dateierweiterungen, die das Skript nicht berührt, wie ".download" für Safari-Downloads, die noch im Gange sind.

Bitte geben Sie eine tatsächliche Auswahl echter Dateinamen von Vorher und Nachher an, was Sie wollen, und bearbeiten Sie es in der Frage.
Welche Version von OS X/macOS verwenden Sie?
Ich habe die neuste Version von El Capitan.
Okay, ich habe es gerade unter OS X 10.11.6 getestet und es funktioniert wie erwartet.

Antworten (1)

Mit Automator habe ich in macOS Sierra 10.12.5 eine Ordneraktion mit einer einzigen Run AppleScript- Aktion erstellt , indem ich den AppleScript- Code unten verwendet habe, und sie so eingestellt, dass sie in meinem Downloads- Ordner ausgeführt wird . (Es wurde auch getestet und funktioniert unter OS X 10.8.5 und OSX 10.11.6.)

  1. Öffnen Sie Automator und wählen Sie Datei > Neu und dann Ordneraktion aus .
  2. Fügen Sie eine Aktion „AppleScript ausführen“ hinzu und ersetzen Sie den Standardcode durch den folgenden Code .
  3. Ändern Sie die set theBlackWhiteList to POSIX path of ...Codezeile entsprechend nach Bedarf.
  4. Legen Sie die Ordneraktion fest, um Dateien und Ordner, die dem Listenfeld Ordner auswählen hinzugefügt wurden , in Ihren Downloads- Ordner aufzunehmen.
  5. Erstellen Sie vor dem Speichern der Ordneraktion die Nur-Text-Datendatei , die von dieser Ordneraktion verwendet wird .
    • Es ist nicht unbedingt notwendig, dies vorher zu tun, aber wenn Sie es in Downloads speichern möchten , würde ich die Datei zuerst erstellen.
  6. Speichern Sie den Automator-Ordneraktions -Workflow .

Lesen Sie die im Code enthaltenen Kommentare , um zu erfahren, was zur Verwendung dieses Codes in der Ordneraktion erforderlich ist .

Um die Ordneraktion zu testen , öffnen Sie Terminal und cd Downloads, erstellen Sie dann die Testdatei mit , wodurch eine Datei mit der Länge Null erstellt wird, die von der Ordneraktion
touch 'Youtube_MyVideofile_(1080p_30fps_H264-128kbit_AAC).mp4' verarbeitet und umbenannt wird wie in Downloads im Finder oder Terminal gezeigt mit:MyVideofile 1080p H264.mp4ls -l My*.mp4

AppleScript -Code :

--  #   
--  #   The AppleScript code of this Folder Action requires a data file, which is laid out as follows:
--  #   
--  #   Lines 1 and 3 state what are on lines 2 and 4 respectively. (These lines are just reminders.)
--  #   
--  #   Line 2 must start with a single space character ' ', followed by the comma delimiter ','!
--  #   Line 2 must also not contain an underscore character '_' as it's used as a 'text item delimiter',
--  #   and all of them will be removed and replaced with a single space, as appropriate, in the last
--  #   part of the processing to form the final filename.
--  #   
--  #       This is used as part of the overall logic applied to creating the finished filename, so as to
--  #       only have a single space character between words of the filename, while ensuring the finished
--  #       filename does not start with nor have directly before the filename extension, a space character. 
--  #   
--  #   Line 2 is a list of strings that will be removed from the filename. (The Black List.)
--  #   Line 4 is a list of filename extensions of the file types that will be processed. (The White List.)
--  #   
--  #   Modify lines 2 and 4 as appropriate, while leaving the single space character at the start of line 2,
--  #   and do not include an underscore character in Line 2.
--  #   
--  #   Example contents of the plain text data file:
--  #   

--  #   # Do Not Remove This Line!: The next line contains a comma-delimited list of strings to be removed:
--  #    ,Youtube,30fps,128kbit,-,AAC,(,)
--  #   # Do Not Remove This Line!: The next line contains a comma-delimited list of file extensions to process:
--  #   mp4,mkv,avi,flv,flac

--  #   For the purposes of testing this script, the name of the data file used is 
--  #   "FileNameExtensionBlackWhiteCleanupList.txt", and is in the User's Downloads folder.
--  #   Obviously you can name it whatever you want and place it where appropriate access exists.
--  #   Modify the 'set theBlackWhiteList to POSIX path of ...' line of code, accordingly as necessary.


on run {input, parameters}
    try
        set theBlackWhiteList to POSIX path of (path to downloads folder) & "FileNameExtensionBlackWhiteCleanupList.txt"

        --  #   Make sure the data file exists and set its contents to the target variables.

        tell application "System Events"
            if (exists file theBlackWhiteList) then
                tell current application
                    set theBlackWhiteList to (read theBlackWhiteList)
                    set AppleScript's text item delimiters to {","}
                    set theStringsToRemoveList to text items of paragraph 2 of theBlackWhiteList as list
                    set theFileExtensionsList to text items of paragraph 4 of theBlackWhiteList as list
                    set AppleScript's text item delimiters to {}
                end tell
            else
                tell current application
                    activate
                    display dialog "The required file, " & quoted form of theBlackWhiteList & ", is missing!" & ¬
                        linefeed & linefeed & "Replace the missing file from backup." buttons {"OK"} ¬
                        default button 1 with title "File Not Found" with icon 0 -- (icon stop)
                    return
                end tell
            end if
        end tell

        --  # Process the target file(s) added to the target folder, that have the target filename extensions. 

        tell application "Finder"
            set theFileList to input
            repeat with thisFile in theFileList
                set theFileName to name of thisFile
                set theOriginalFileName to theFileName
                --  #   Get the filename extension of thisfile.
                set AppleScript's text item delimiters to {"."}
                set thisFileExtension to last text item of theFileName as string
                --  #   Only process if thisFileExtension is in theFileExtensionsList. 
                if theFileExtensionsList contains thisFileExtension then
                    repeat with i from 1 to count of theStringsToRemoveList
                        set AppleScript's text item delimiters to item i of theStringsToRemoveList
                        set theTextItems to text items of theFileName
                        set AppleScript's text item delimiters to {"_"}
                        set theFileName to theTextItems as string
                        set AppleScript's text item delimiters to {}
                    end repeat
                    --  #                       
                    --  #   Using the example filename in the OP, 'Youtube_MyVideofile_(1080p_30fps_H264-128kbit_AAC).mp4',
                    --  #   at this point in the processing it would be, '__MyVideofile__1080p___H264_____.mp4', and while one 
                    --  #   probably could continue to use AppleScript 'text items' and 'text item delimiters', nonetheless I can do
                    --  #   it easier using 'sed' to finish getting the final filename. This is also part of the reason I started the
                    --  #   'theStringsToRemoveList' with a single space character and do not allow an underscore character in Line 2.
                    --  #                       
                    tell current application
                        set theFileName to (do shell script "printf " & quoted form of theFileName & " | sed -E -e 's/[_]{2,}/_/g' -e 's/^_//' -e 's/_\\./\\./g' -e 's/_/ /g'")
                    end tell
                    --  #   Only change the filename if it has actually changed by the processing above.
                    --  #   There's no sense in telling Finder to name a file the same name it already is. 
                    if theFileName is not equal to theOriginalFileName then
                        try
                            set the name of thisFile to theFileName
                        end try
                    end if
                    --  #   At this point the final filename, using the example filename, would be 'MyVideofile 1080p H264.mp4'.
                    --  #   This assumes this filename didn't already exist and why the 'do shell script' command is within a 'try'
                    --  #   statement. Additional coding and logic could be applied to increment the filename if it already existed.
                end if
            end repeat
            set AppleScript's text item delimiters to {}
        end tell

    on error eStr number eNum
        set AppleScript's text item delimiters to {}
        display dialog eStr & " number " & eNum buttons {"OK"} default button 1 with icon caution
        return
    end try
end run

Beispielinhalt der Klartext-Datendatei, die von der Ordneraktion verwendet wird :

# Do Not Remove This Line!: The next line contains a comma-delimited list of strings to be removed:
 ,Youtube,30fps,128kbit,-,AAC,(,)
# Do Not Remove This Line!: The next line contains a comma-delimited list of file extensions to process:
mp4,mkv,avi,flv,flac

Die Logik hinter dem Umbenennungsprozess:

Die Verwendung der Variablen theStringsToRemoveList , die mit einem einzelnen Leerzeichen gefolgt von dem Komma-Trennzeichen beginnt, in Verbindung mit dem Unterstrich als text item delimiter, wandelt alle Leerzeichen zusammen mit allen anderen zu entfernenden Zeichenfolgen während des AppleScripts text itemsund text items delimiterseines Teils des Codes in Unterstriche um .

Dies geschieht, damit sedalle gleichzeitigen Unterstriche durch einen einzelnen Unterstrich ersetzt werden können, dann der führende Unterstrich entfernt wird, falls vorhanden, gefolgt von einem Unterstrich vor dem Punkt vor der Dateinamenerweiterung, falls vorhanden, und schließlich alle einzeln bleiben Unterstriche werden durch ein einzelnes Leerzeichen ersetzt.

set theFileName to (do shell script "printf " & quoted form of theFileName & " | sed -E -e 's/[_]{2,}/_/g' -e 's/^_//' -e 's/_\\./\\./g' -e 's/_/ /g'")
  • set theFileName to- Die Variable theFileName enthält die Ausgabe des do shell script Befehls .
  • do shell script "_command_"- Führt den Befehl in einer shell.
  • printf " & quoted form of theFileName & " |- Druckt den Wert der Variablen theFileName und leitet |ihn an den sed Befehl weiter .

  • sed -E -e 's/[_]{2,}/_/g' -e 's/^_//' -e 's/_\\./\\./g' -e 's/_/ /g'

  • sed- Stream-Editor.

  • -E- Interpretieren Sie reguläre Ausdrücke als erweiterte (moderne) reguläre Ausdrücke und nicht als grundlegende reguläre Ausdrücke (BREs). Die Handbuchseite re_format(7) beschreibt beide Formate vollständig.
  • -e command- Anhängen der durch das Befehlsargument angegebenen Bearbeitungsbefehle an die Befehlsliste.
  • s/[_]{2,}/_/g
    • s- Ersatzmuster-Flag.
    • [_]{2,}- Übereinstimmung mit einem einzelnen Zeichen in der Liste, Übereinstimmung mit dem Zeichen _wörtlich (Groß-/Kleinschreibung beachten).
    • {2,}- Quantifier — Übereinstimmungen zwischen 2 und unbegrenzt oft, so oft wie möglich, nach Bedarf zurückgeben (gierig).
    • /_/- Ersetzt übereinstimmendes Muster _buchstäblich durch ein einzelnes Zeichen (Groß-/Kleinschreibung beachten).
    • g- Globaler Muster-Flag- gModifikator, stimmt mit allen Vorkommen des Musters überein (kehrt nicht nach der ersten Übereinstimmung zurück).
  • s/^_//
    • ^- Bestätigt die Position am Anfang der Zeichenfolge.
    • _- Stimmt _wörtlich mit dem Zeichen überein (Groß-/Kleinschreibung beachten).
    • //- Ersetzt das übereinstimmende Muster durch buchstäblich nichts.
  • s/_\\./\\./g
    • _- Stimmt _wörtlich mit dem Zeichen überein (Groß-/Kleinschreibung beachten).
    • \\.- Stimmt .wörtlich mit dem Zeichen überein (Groß-/Kleinschreibung beachten).
    • /\\./- Ersetzt das übereinstimmende Muster .buchstäblich durch das Zeichen (Groß-/Kleinschreibung beachten).
      • Hinweis: Der doppelte umgekehrte Schrägstrich \\ist erforderlich, wenn er in einem do shell script Befehl verwendet wird . Von der Befehlszeile aus \würde jedoch ein einfacher umgekehrter Schrägstrich verwendet werden, um das Zeichen zu erstellen ., das in diesem Fall auf ein Literalzeichen folgt.
  • s/_/ /g
    • Ersetzt das Zeichen _wörtlich durch ein wörtliches Zeichen (Groß-/Kleinschreibung beachten).

Beachten Sie, dass die obigen Informationen an einigen Stellen abgekürzt sind, sie sollten jedoch ein wenig zum Verständnis dessen beitragen, was passiert.

Wenn Sie auch die Großschreibung jedes Wortes im Dateinamen sicherstellen möchten, ersetzen Sie den vorhandenen do shell script Befehl durch den folgenden do shell script Befehl , der einen zusätzlichen awk Befehl enthält , der die Ausgabe von empfängt, sedum die Großschreibung durchzuführen. awk Beachten Sie, dass ich diesen Befehl im Internet gefunden und getestet habe, dass er funktioniert, jedoch aus Zeitgründen keine Erklärung hinzufügen werde, wie er funktioniert.

set theFileName to (do shell script "printf " & quoted form of theFileName & " | sed -E -e 's/[_]{2,}/_/g' -e 's/^_//' -e 's/_\\./\\./g' -e 's/_/ /g' | awk '{for(i=1;i<=NF;i++){ $i=toupper(substr($i,1,1)) substr($i,2) }}1'")

.Aktualisieren Sie, um 's im Dateinamen gemäß den Kommentaren zu adressieren .

Fügen Sie in der Nur-Text-Datendatei in Zeile 2 ein .,nach dem führenden Leerzeichen und seinem Komma-Trennzeichen hinzu. Mit anderen Worten, das erste Element in der Liste in Zeile 2 ist ein Leerzeichen, gefolgt von einem Komma-Trennzeichen, gefolgt von .gefolgt von einem Komma-Trennzeichen und so weiter.

Fügen Sie die folgenden Codezeilen nach der repeat Schleife hinzu , die direkt vor dem Kommentar beginnt, -- # Using the example filename in the OP. ...der sich über dem tell current application...- do shell scriptCodeblock befindet .

            set AppleScript's text item delimiters to {"_" & thisFileExtension}
            set theTextItems to text items of theFileName
            set AppleScript's text item delimiters to {"_"}
            set theFileName to (theTextItems as string) & "." & thisFileExtension
            set AppleScript's text item delimiters to {}    

Durch das Hinzufügen von .,bis Zeile 2 in der Klartext-Datendatei .werden alle im Dateinamen durch _im ursprünglichen Code ersetzt . Dann ersetzt es mit den zusätzlichen Codezeilen oben_mp4 zB durch .mp4, oder .und was auch immer die eigentliche Dateinamenerweiterung ist.

Jetzt, wenn es zum do shell script Befehl kommt , gibt es nur das .für die Dateinamenerweiterung und alle Unterstriche werden aus dem Namen verarbeitet, wie sie sollten.

Offensichtlich ist die Art und Weise, wie der Originalcode codiert ist, Unterstriche nicht Teil des endgültigen Dateinamens, und diese Änderung des Originalcodes ändert daran nichts.

Wow. Riesen Dank für deine Mühe! Ich werde es später versuchen!
Ich habe es getestet und Ihr Skript funktioniert absolut einwandfrei! Auch ich bin absolut begeistert von deiner Erklärung. Dies ist perfekt für mich, um das Skript noch weiter für meine Bedürfnisse zu ändern, da sie sich ändern könnten. Perfekt wäre nur eines: Wenn es auch mit Unterordnern funktionieren würde. Kannst du noch einmal helfen? vielen Dank!!!
Mit Ihrer Beschreibung habe ich versucht, "." zu ersetzen. mit Leerzeichen, indem Sie Ihren Code in ändern, tell current application set theFileName to (do shell script "printf " & quoted form of theFileName & " | sed -E -e 's/[_]{2,}/_/g' -e 's/^_//' -e 's/_\\./\\./g' -e 's/_/ /g' -e 's/\\./ /g'") end tellaber es wirkt sich auch auf die Dateierweiterung aus und entfernt das "." davon und daher wird die Datei nicht richtig erkannt. trotzdem, um die Erweiterung vor dem Umbenennungsprozess zu schützen?
@Maximilian Becker, dieses neue Szenario ist genau der Grund, warum ich im ersten Kommentar zu Ihrer Frage " Bitte stellen Sie eine tatsächliche Auswahl echter Dateinamen sowohl vor als auch nach dem, was Sie wollen " gestellt habe, und Sie haben nur ein Beispiel für einen Pseudo-Dateinamen angegeben! .Hätte ich gewusst, dass es mehr 's als die Dateinamenerweiterung geben würde , hätte ich dies anders codiert. Ich werde ganz am Ende der ursprünglichen Antwort einen Abschnitt hinzufügen, um die .'s im Dateinamen zu behandeln. sed Ändern Sie den Befehl nicht , ich füge vor dem do shell script Befehl Code hinzu, um dies zu handhaben .
@Maximilian Becker, ich habe ein Update hinzugefügt, um .'s in Dateinamen zu adressieren.