Acción de carpeta para la limpieza automática del nombre de file

Quiero crear una acción de carpeta que limpie los nombres de file de mis files descargados.

Por ejemplo, Youtube_MyVideofile_ (1080p_30fps_H264-128kbit_AAC) .mp4 debe ser eliminado por "Youtube" "30fps" "128kbit" "AAC" "(" ")" y "_" debe ser reemplazado por un "espacio". El resultado sería MyVideofile 1080p H264.mp4

  • Omitir files .DS_Store al copyr entre dos unidades externas
  • Archivo o directory llamado ~ (tilde) en la raíz de mi volumen de inicio
  • Las imágenes de disco ya no aparecen en la barra lateral del Finder
  • La HD externa ha desaparecido del Finder
  • Cómo recuperar un file de la Papelera
  • La aplicación está en gris
  • Sé que podría hacer esto con Automator, pero luego tengo que configurar un elemento de "búsqueda / reemploop" para cada palabra. Prefiero usar una sola list de palabras que sería más fácil de mantener, porque tengo muchas fonts diferentes de donde obtengo files de forma regular, por lo que la list real de palabras que se eliminarán será muy larga y puede ser actualizado de vez en cuando.

    ¿Encontré este Automator o AppleScript para eliminar varias cadenas de nombres de files? que es similar, pero solo funcionó con carpetas seleccionadas. En su lugar, quiero configurarlo para que funcione automáticamente como una acción de carpeta.

    Supongo que, por lo tanto, también necesito una list blanca de extensiones de files que el script no toque, como ".download" para safaris, descargas que aún están en progreso.

  • ¿Qué hace Mail cuando intentas dejarlo?
  • ¿Cómo agregar un file AppleScript a la barra de herramientas del Finder para ejecutar AppleScript?
  • La búsqueda del buscador de la cadena erróneamente no devuelve resultados, pero la subcadena proporciona resultados correctamente
  • ¿Qué significa cuando un process está rodeado de parens en `ps`?
  • Cómo encontrar un set de files que contienen una determinada frase usando la interfaz gráfica de usuario de MacOS
  • Obtener / copyr la ruta del file actual de Excel
  • One Solution collect form web for “Acción de carpeta para la limpieza automática del nombre de file”

    Usando Automator , en macOS Sierra 10.12.5, creé una Acción de Carpeta con una sola acción Ejecutar AppleScript , usando el código AppleScript a continuación, y lo configuré para que se ejecute en mi carpeta de Descargas . (También se ha probado y funciona en OS X 10.8.5 y OSX 10.11.6).

    1. Abra Automator y select Archivo > Nuevo , luego Acción de carpeta .
    2. Agregue una acción Ejecutar AppleScript , reemplazando el código pnetworkingeterminado con el siguiente código .
    3. Modifique el set theBlackWhiteList to POSIX path of ... línea de código , según corresponda según sea necesario.
    4. Establecer la acción de carpeta recibe los files y carpetas agregados al listbox Elegir carpeta a su carpeta de Descargas .
    5. Antes de save la Acción de carpeta , cree el file de datos de text sin formatting que utilizará esta Acción de carpeta .
      • No es absolutamente necesario hacerlo antes, sin embargo, si va a savelo en Descargas , primero crearía el file.
    6. Guarde el flujo de trabajo de la Acción de carpeta de Automator .

    Lea los comentarios , incluidos con el código , de lo que es necesario para usar este código en la Acción de carpeta .

    Para probar la Acción de carpeta , abra cd Downloads Terminal y cd Downloads , luego cree el file de testing con,
    touch 'Youtube_MyVideofile_(1080p_30fps_H264-128kbit_AAC).mp4' , que creará un file de longitud cero que será procesado por la Acción de carpeta y MyVideofile 1080p H264.mp4 nombre a MyVideofile 1080p H264.mp4 como se muestra en Descargas en Finder o Terminal con: ls -l My*.mp4

    Código de AppleScript:

     -- # -- # 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 requinetworking 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 

    Contenido de ejemplo del file de datos de text sin formatting utilizado por la acción de carpeta :

     # 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 

    La lógica detrás del process de cambio de nombre:

    El uso de la variable theStringsToRemoveList , que comienza con un carácter de espacio único seguido del delimitador de comas, junto con el carácter de subrayado como text item delimiter , convierte todos los espacios junto con todas las demás cadenas en caracteres de subrayado durante los text items de AppleScript text items y text items delimiters parte del código .

    Esto se hace para que sed se pueda usar para replace todos los caracteres de subrayado simultáneos con un solo guión bajo, luego quite el guión bajo inicial, si existe, seguido de un guión bajo precediendo el punto antes de la extensión del nombre de file, si existe, y finalmente todo los caracteres de subrayado individuales se reemplazan con un carácter de espacio único.

     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 – La variable theFileName contendrá el resultado del command de do shell script .
    • do shell script "_command_" – Ejecuta el command en un shell .
    • printf " & quoted form of theFileName & " | – Imprime el valor de la variable theFileName y pipes | al command sed .

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

    • sed – Stream EDitor.

    • -E – Interpreta expresiones regulares como expresiones regulares extendidas (modernas) en lugar de expresiones regulares básicas (BRE's). La página del manual re_format (7) describe completamente ambos formattings.
    • -e command : añada los commands de edición especificados por el argumento del command a la list de commands.
    • s/[_]{2,}/_/g
      • s – Indicador de patrón sustitutivo.
      • [_]{2,} – Haga coincidir un solo carácter presente en la list, coincide con el carácter _ literalmente (distingue entre mayúsculas y minúsculas).
      • {2,} – Cuantificador: coincide entre 2 y un número ilimitado de veces, tantas veces como sea posible, devolviéndolo según sea necesario (codicioso).
      • /_/ – Reemplaza el patrón emparejado con un solo carácter _ literalmente (distingue entre mayúsculas y minúsculas).
      • g – Modificador de bandera global de patrones g , coincide con todas las apariciones del patrón, (no regresa después de la primera coincidencia).
    • s/^_//
      • ^ – Afirma la position al inicio de la cadena.
      • _ – Coincide con el carácter _ literalmente (distingue entre mayúsculas y minúsculas).
      • // – Reemplaza el patrón combinado con literalmente nada.
    • s/_\\./\\./g
      • _ – Coincide con el carácter _ literalmente (distingue entre mayúsculas y minúsculas).
      • \\. – Coincide con el personaje . literalmente (distingue entre mayúsculas y minúsculas)
      • /\\./ – Reemplaza el patrón combinado con el personaje . literalmente (distingue entre mayúsculas y minúsculas)
        • Nota: La doble barra \\ es necesaria cuando se usa en un command de do shell script , sin embargo, desde la línea de command se usaría una sola barra invertida \ para crear el carácter que sigue a un literal . personaje, en este caso.
    • s/_/ /g
      • Reemplaza el carácter _ literalmente, con un personaje literalmente (distingue entre mayúsculas y minúsculas)

    Tenga en count que la información anterior se abrevia en lugares, sin embargo, debe proporcionar un poco de comprensión de lo que está sucediendo.

    Como nota adicional, si también quiere asegurar el uso de mayúsculas de cada palabra en el nombre de file, entonces reemplace el command do shell script existente con el command do shell script debajo, que tiene un command awk agregado que recibe el resultado de sed para preformar el capitalización. Tenga en count que encontré este command awk en Internet y probé que funciona, sin embargo, no agregará una explicación de cómo funciona por falta de time.

     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'") 

    Actualiza a la dirección . Está en el nombre del file, según los comentarios.

    En el file de datos de text sin formatting, en la línea 2, agregue a ., Después del espacio inicial y su delimitador de comas. En otras palabras, el primer elemento de la list en la Línea 2 es un espacio en blanco seguido de un delimitador de coma seguido de . seguido de un delimitador de coma y demás.

    Agregue las siguientes líneas de código después del ciclo de repeat justo antes del comentario que comience con -- # Using the example filename in the OP. ... -- # Using the example filename in the OP. ... que está por encima de la tell current applicationdo shell script bloque de código do shell script .

      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 {} 

    Al agregar ., línea 2 en el file de datos de text sin formatting, todos . en el nombre de file se reemplazan por _ en el código original. Luego, con las líneas adicionales de código anteriores, reemplaza, por ejemplo, _mp4 con .mp4 , o . y cualquiera que sea la extensión real del nombre de file.

    Ahora cuando llega al command do shell script solo está el . para la extensión del nombre de file y todos los guiones bajos se procesan fuera del nombre como deberían.

    Obviamente, la forma en que se codifica el código original, los subrayados no pueden ser parte del nombre del file final, y esta modificación del código original no cambia eso.

    Loving Apple Products like poisoning (iPhone, iPad, iMac, Macbook, iWatch).