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.
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.)
set theBlackWhiteList to POSIX path of ...
Codezeile entsprechend nach Bedarf.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.mp4
ls -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 items
und text items delimiters
eines Teils des Codes in Unterstriche um .
Dies geschieht, damit sed
alle 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- g
Modifikator, 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).
\\
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
_
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, sed
um 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 script
Codeblock 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.
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 tell
aber 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?.
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 ..
's in Dateinamen zu adressieren.
Benutzer3439894
Benutzer3439894
Maximilian Becker
Benutzer3439894