¿Puede Automator distribuir una gran cantidad de archivos en subcarpetas contadas?

0

Me gustaría crear una aplicación Automator que cuente los archivos en la carpeta del host, crea una subcarpeta numerada llamada " [hostFolder name] [counter] ", mueve al máximo 128 archivos desde hostFolder en forma secuencial ordene en esta nueva subcarpeta y realice un bucle hasta que todos los archivos en hostFolder se clasifiquen en subcarpetas (es decir, la última subcarpeta tendrá menos de 128 archivos). Antes de que se ejecute el flujo de trabajo, la carpeta del host solo contendrá archivos, no subcarpetas.

Aquí está el resultado deseado de mi flujo de trabajo ideal utilizando como ejemplo una carpeta arbitraria que contiene un número arbitrario de archivos, también nombrados arbitrariamente. (Tenga en cuenta que no necesito el flujo de trabajo para cambiar el nombre de ningún archivo):

  

Una carpeta llamada Beans contiene 1027 archivos, los archivos Legume 0001 a Legume 1027. La aplicación My Automator recibe la carpeta Beans como entrada. Una vez que se ha ejecutado el flujo de trabajo, la carpeta Beans ahora contiene 9 subcarpetas, llamadas Beans 1, Beans 2, Beans 3, y así sucesivamente hasta Beans 9.

     

La subcarpeta Beans 1 contiene los archivos Legume 0001, Legume 0002, Legume 0003, etc., a Legume 0128. La subcarpeta Beans 2 contiene los archivos Legume 0129 a Legume 0256. En otras palabras, cada subcarpeta contiene 128 de Los archivos llamados Legume **** en orden secuencial. La única excepción es la subcarpeta final, Beans 9, que contiene solo 3 archivos, los archivos Legume 1025, Legume 1026 y Legume 1027.

    
pregunta youngdevon 19.08.2016 - 19:01

1 respuesta

2

Esto debería hacer lo que has pedido. Como está codificado, lo único que puede necesitar cambiar en bash script es filesPerSubDir="128" si desea un recuento de archivos diferente por subdirectorio dentro del directorio principal que se pasa a la acción Ejecutar script de shell .

Agregue una acción de Ejecución del script de shell a su aplicación / servicio / flujo de trabajo de Automator y establezca Shell: /bin/bash y Pass input: as arguments . Elimine el código predeterminado y luego copie y pegue el código a continuación en la acción de Automator Run Shell Script .

#!/bin/bash

filesPerSubDir="128"

for argument in "$@"; do
    if [[ -d $argument ]]; then
        cd "$argument" || exit 1
        dirName="$(basename "$argument")"
        fileCount="$(find . -maxdepth 1 -flags nohidden -type f ! -iname ".*" | awk 'END{print NR}')"
        subDirCount="$(( fileCount / filesPerSubDir + 1 ))"
        for (( i = 1; i < subDirCount+1; i++ )); do
            find . -maxdepth 1 -flags nohidden -type f ! -iname ".*" | head -$filesPerSubDir > .moveList
            if [[ -s  .moveList ]]; then
                mkdir "$dirName $i"
                while IFS= read -r file; do
                    mv "$file" "$dirName $i"
                done < .moveList
            fi
        done
        rm .moveList
    fi
done

La imagen de abajo muestra una prueba del código y el flujo de trabajo se completó exitosamente como lo indican los círculos verdes con la marca de verificación. Este es solo un ejemplo de cómo implementar la acción de Ejecutar el shell. Se puede hacer de muchas maneras, sin embargo, solo tiene que elegir qué método quiere pasarle las carpetas en Finder, el resto es hecho por el script .

Laimagendeabajomuestraelcódigoconresaltadosintácticoyseincluyecomoayudaparaleerelcódigo(especialmentecuandoelcódigonoestá'Comenté,losiento,notengotiempoenestemomento).

Nota: El bash script no está codificado para manejar una nueva línea incrustada en el nombre de un objeto del sistema de archivos, que IMO no Pertenezco allí en primer lugar! Siéntase libre de modificar según sea necesario / desea satisfacer sus necesidades, agregando / modificando código y / o verificando errores adicionales si / cuando se desea / necesita. Además, esta no es de ninguna manera la única manera de codificar el script para manejar lo que usted desea de manera automática, pero es lo que junté para obtener algo publicado para usted. Si tiene alguna pregunta, solo pregunte.

    
respondido por el user3439894 20.08.2016 - 09:42

Lea otras preguntas en las etiquetas