Automator può distribuire un numero elevato di file in sottocartelle contate?

0

Mi piacerebbe creare un'applicazione di Automator che conti i file nella cartella host, crea una sottocartella numerata denominata " [nomeFolder host] [contatore] ", sposta al massimo 128 file da hostFolder in sequenza ordina in questa nuova sottocartella e loop finché tutti i file in hostFolder non vengono ordinati in sottocartelle (ovvero l'ultima sottocartella contiene meno di 128 file al suo interno). Prima dell'esecuzione del flusso di lavoro, la cartella host contiene sempre solo file, senza sottocartelle.

Ecco il risultato desiderato del mio flusso di lavoro ideale utilizzando come esempio una cartella arbitraria contenente un numero arbitrario di file, anch'essi nominati arbitrariamente. (Nota: non ho bisogno del flusso di lavoro per rinominare alcun file):

A folder named Beans contains 1027 files, the files Legume 0001 to Legume 1027. My Automator application receives the folder Beans as input. Once the workflow has run, the folder Beans now contains 9 subfolders, named Beans 1, Beans 2, Beans 3, and so on all the way to Beans 9.

The subfolder Beans 1 contains files Legume 0001, Legume 0002, Legume 0003, and so on to Legume 0128. The subfolder Beans 2 contains the files Legume 0129 to Legume 0256. In other words, each subfolder contains 128 of the files named Legume **** in sequential order. The only exception is the final subfolder, Beans 9, which contains only 3 files, the files Legume 1025, Legume 1026, and Legume 1027.

    
posta youngdevon 19.08.2016 - 19:01
fonte

1 risposta

2

Questo dovrebbe fare ciò che hai chiesto. Come codificato, l'unica cosa che potrebbe essere necessario modificare nello script bash è filesPerSubDir="128" se si desidera un conteggio file diverso per sottodirectory all'interno della directory padre passato all'azione Esegui script shell .

Aggiungi uno script di shell Run azione al tuo flusso di lavoro / servizio / applicazione di Automator e imposta Shell: /bin/bash e Pass input: as arguments . Rimuovi il codice predefinito e poi copia e incolla il codice sotto in Script Shell di Automator Esegui azione .

#!/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

L'immagine sotto mostra un test del codice e il flusso di lavoro è stato completato correttamente come indicato dalle cerchie verdi con il segno di spunta. Questo è solo un esempio di come implementare l' action di Run Shell Script, può essere fatto in molti modi, ma devi solo scegliere il metodo con cui vuoi passare le cartelle in Finder, il resto è fatto dallo script .

L'immaginesottomostrailcodiceconevidenziazionesintatticaedèinclusainquantoaiutaaleggereilcodice(specialmentequandoilcodiceisn'thacommentato,scusanonhotempoalmomento).

Nota: lo script bash non è codificato per gestire una nuova riga incorporata nel nome di un oggetto file system, che IMO non Appartengo lì in primo luogo! Sentiti libero di modificare se necessario / voluto soddisfare le tue esigenze, aggiungendo / modificando codice e / o il controllo degli errori aggiuntivi se / quando desiderato / necessario. Inoltre, questo non è assolutamente l'unico modo per codice lo script per gestire ciò che vuoi automatizzato, ma è ciò che ho buttato insieme per ottenere qualcosa che hai postato per te. Se hai domande, chiedi pure.

    
risposta data 20.08.2016 - 09:42
fonte

Leggi altre domande sui tag