2 votos

¿Cómo puedo reproducir el Buscador de orden sin pedir Buscador para ordenar para mí?

Yo trabajo con una gran colección de la mayoría de los archivos de texto, subdividido por la serie, periódicamente reflejo de una aguas arriba del repositorio y el reenvasado de ellos usando un script de shell de un poco caótica organización de origen en más ordenada y compacta formas. Las fuentes se recogen en los directorios de los archivos para cada una de las series de numeración a partir de un puñado de cientos de personas por juego, con un semi-ordenada humano orientado a la convención de nomenclatura que se remonta a la década de los 90 con este patrón general:

multi-palabra-de serie-nombre de[-$subsetnumber]-$docnumber[.{txt,html,pdf}]

En el que una serie puede o no puede tener subconjuntos, los subconjuntos pueden ser numerados con números romanos o arábigos, una serie puede comenzar con numeradas docs en ningún subconjunto y luego obtener un subconjunto de la etiqueta "II" o "2", y así sucesivamente. Estos nombres funcionan bien para las personas que las usan desde el Finder, que en la mayoría de los casos las órdenes de ellos en una manera sensible y detecta que el nombre-II-1 llega más tarde de nombre-6 y ese nombre-2 no tiene nombre-19. Porque mi reenvasado consiste en el montaje de la versión más reciente de cada serie en un solo archivo en su orden racional, yo uso un simple bit de AppleScript que utiliza el Buscador para ordenar los nombres de los elementos en un determinado directorio. Esto produce 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. Me escribió alrededor del año 2008 y sobre todo me odio AppleScript...) Este es compilado en un script llamado "flista.scpt" y ejecutar desde mi script de shell con "osascript flista.scpt /ruta/a/serie/carpeta/". El resultado de ejecutar el script con un directorio que contiene 26 archivos es el de la vinculación del cpu por más de 2 minutos. Para la comparación, 'ls' da léxicamente resultados ordenados en la misma máquina (un G5 iMac con Leopard... no, no se rían, es una utilidad de la máquina) en 0.008 s con el guión de mascar en el mismo directorio en el fondo.

Yo estoy buscando para deshacerse de que AppleScript por completo, pero no he encontrado una manera de reproducir el Buscador de lógica de ordenación fácilmente, es decir, mediante el establecimiento de una configuración regional o dar algunos argumentos complejos para 'ordenar' que para los nombres correctamente. Mi solución alternativa si no puedo encontrar algo de lata para ello será reproducir el Buscador de la lógica de mí mismo en alguna mala mezcla de ordenar, sed, awk, y la cáscara, pero realmente me gustaría para evitar que, si es posible. Si hay algo goofy sobre mi AppleScript que está causando los estragos de rendimiento, la fijación de los que sería casi tan bueno como un conjuro mágico para 'ls' para que sea tipo como el Buscador.

ACTUALIZACIÓN: SOLUCIONADO! Probé por primera vez el Perl de Ordenación::Naturalmente módulo, pero ordenados de la etiqueta-subconjunto nombres por delante de la implícita subconjunto "yo" de los miembros, que no es lo que yo quería. Así que me fui por delante y se zambulló en la escritura de mi primer script en Ruby, después de hackear una corrección en el Leopard Ruby config para hacer 'joya' de trabajo en el mundo moderno y la instalación de la naturalsort joya. El reemplazo de Ruby script (llamado con un nombre de directorio 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 diferencias menores en la salida que esta incluye . y .. las entradas y delimita las entradas de línea en lugar de con espacios, pero como esta es la que se llama desde un script de shell que ya se filtra algunos de los nombres especiales estas son triviales para manejar.

2voto

Fuzzy Purple Monkey Puntos 702

El exacto orden de clasificación utilizado por el Buscador probablemente depende de la configuración regional, pero que lenguajes como Ruby y Python tienen las bibliotecas para ordenar 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)

0voto

adayzdone Puntos 1258

La construcción de una cadena utilizando

set a to a & b

no es tan rápido como la construcción de una lista y coaccionar a texto al final.

Probar:

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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X