¿Cómo puedo reproducir el order de sorting de Finder sin pedirle a Finder que ordere por mí?

Trabajo con una gran colección de files de text en su mayoría subdivididos por series, reflejándolos periódicamente desde un repository en sentido ascendente y volviéndolos a empaquetar utilizando un script de shell desde una organización de origen ligeramente caótica en formularios más orderados y compactos. Las fonts se recostackn en directorys de files para cada número de serie de un puñado a cientos por set, con una convención de nomenclatura semi-orderada orientada a los humanos que se remonta a los años 90 con este patrón general:

multi-word-series-name [- $ subsetnumber] – $ docnumber [. {txt, html, pdf}]

  • alternar playPause para iPhoto, problema de script, probablemente variable global
  • Safari: menu para mostrar las tabs activas abiertas en windows abiertas
  • Configuración del entorno de scripting
  • ¿Cómo creo un autómata para reenviar correos?
  • applescript getElementsByName en Chrome
  • ¿Alguien puede explicar por qué funcionan estos scripts?
  • Cuando una serie puede o no tener subsets, los subsets pueden numerarse con numbers arábigos o árabes, una serie puede comenzar con documentos numerados en ningún subset y más tarde get un subset labeldo como "II" o "2", y así sucesivamente. Estos nombres funcionan bien para las personas que los utilizan desde el Finder, que en la mayoría de los casos los ordera de una manera sensible a los humanos y detecta ese nombre-II-1 viene más tarde que name-6 y ese nombre-2 no aparece después del nombre-19 . Debido a que mi reempaquetado consiste en ensamblar la última versión de cada serie en files individuales en su order racional humano, uso un poco de AppleScript que usa el Buscador para orderar los nombres de los elementos en un directory determinado. Esto arroja resultados correctos, pero es espectacularmente ineficiente por razones que no entiendo. El AppleScript es:

    on run argv set op to "" set upath to POSIX file argv as string tell application "Finder" set foo to every item of folder upath set foo to sort foo by name repeat with curfile in foo set thisname to the name of curfile set op to op & " " & thisname as string end repeat end tell return op end run 

    (Y no, no recuerdo por qué lo hice de esa manera. Lo escribí alnetworkingedor de 2008 y odio sobre todo AppleScript …) Esto se comstack en un script llamado "flist.scpt" y se ejecuta desde mi script de shell con " osascript flist.scpt / ruta / a / serie / carpeta / ". El resultado de ejecutar esa secuencia de commands con un directory que tiene 26 files es vincular la CPU por más de 2 minutos. Para comparar, 'ls' da resultados orderados léxicamente en la misma máquina (un iMac G5 que ejecuta Leopard … no se ríe, es una máquina de utilidad) en 0.008s con el script masticando en el mismo directory en el background.

    Estoy tratando de deshacerme de AppleScript por completo, pero no he encontrado una manera de reproducir la lógica de orderamiento de Finder fácilmente, es decir, estableciendo una configuration regional o dando algunos arguments complejos para 'orderar' que orderarán los nombres correctamente. Mi solución alternativa si no puedo encontrar algo enlatado para hacer esto será reproducir la lógica del Finder en una mala combinación de tipo, sed, awk y shell, pero realmente me gustaría evitar eso si es posible. Si hay algo torpe en mi AppleScript que está causando el horrible desempeño, arreglarlo sería casi tan bueno como un hechizo mágico para 'ls' para que se ordere como el Finder.

    ACTUALIZACIÓN: SOLUCIONADO Primero probé el module Perl Sort :: Naturally, pero clasificó los nombres de subsets labeldos antes que los miembros del subset "I" implicados, que no es lo que quería. Así que seguí adelante y me lancé a escribir mi primer script de Ruby, después de hackear una solución en la configuration de Leopard Ruby para hacer que la 'gem' funcione en el mundo moderno e instalar la gem natural. El script de Ruby de reemploop (llamado con un nombre de directory como argumento) es:

     #! /usr/bin/env ruby -rubygems -KU # Largely cargo-culted from stackexchange response. # I dunno what exactly the shebang line opts to ruby do. Probably pwn me. # My first Ruby script ever. Don't laugh too hard. require 'natural_sort' # gem install naturalsort dname = ARGV[0] input = Dir.entries(dname) puts NaturalSort.naturalsort(input) 

    Las pequeñas diferencias en el resultado son que esto incluye el. y … inputs y delimita las inputs por línea en lugar de espacios, pero como esto se llama desde un script de shell que ya filtra algunos nombres especiales, estos son triviales de manejar.

  • ¿Puedo replace caracteres en AppleScript?
  • ¿Cómo le digo a Finder que siempre muestre mi carpeta de biblioteca en Mavericks?
  • Problemas con Finder y Dock en OSX 10.10.1
  • Impresora Implemente con perfiles preestablecidos personalizados para estaciones de trabajo Mac OS X.
  • Cambiar el keyboard siempre que se select iTerm
  • ¿Por qué Spotlight no puede encontrar una aplicación que sé que hay allí?
  • 2 Solutions collect form web for “¿Cómo puedo reproducir el order de sorting de Finder sin pedirle a Finder que ordere por mí?”

    El order exacto de sorting utilizado por Finder probablemente depende de la configuration regional, pero los lenguajes de scripting como Ruby y Python tienen bibliotecas para orderar cadenas de forma natural.

     #!/usr/bin/env ruby -rubygems -KU require 'natural_sort' # gem install naturalsort input = "name-II-1 name-6 name-2 name-19".lines # input = Dir["#{ENV['HOME']}/Documents/*"] puts NaturalSort.naturalsort(input) 

    Construyendo una cadena usando

     set a to a & b 

    no es tan rápido como crear una list y forzarla a text al final.

    Tratar:

     on run argv set op to {} tell application "Finder" to set foo to sort every item of folder argv by name repeat with curfile in my foo tell application "System Events" to set end of op to name of curfile & space end repeat return op as text end run 
    Loving Apple Products like poisoning (iPhone, iPad, iMac, Macbook, iWatch).