Come preservare i timbri data JPEG durante il ridimensionamento Automator?

3

I servizi di automazione incorporati come menu di scelta rapida sono un ottimo modo per ridimensionare rapidamente i file JPEG nel mirino. Fai clic con il pulsante destro del mouse sul file, scegli lo script di ridimensionamento, fatto in pochi secondi. Il problema è che cancella i timbri di data dei file, sovrascrivendoli con la data dell'operazione di ridimensionamento.

C'è un modo di utilizzare Automator per conservare i timbri di data durante il ridimensionamento?

Se non in Automator c'è un modo migliore per farlo?

    
posta SeanJ 03.01.2016 - 18:46
fonte

3 risposte

3

Ecco un modo per raggiungere l'obiettivo dichiarato con un servizio di automazione . Invece di utilizzare Scala immagini usa Esegui script shell con impostazioni, Shell: / bin / bash e Passa input: come argomenti e aggiungi il seguente codice :

for f in "$@"; do

        # Get the creation date time stamp of the target file, saved as 't'.

    t="$(/usr/bin/GetFileInfo -d "$f")"

        # Get the pixel width of the target file and divide it by 2 for a 50% scaling, saved as 'w'.

    w="$(/usr/bin/sips -g pixelWidth "$f" | /usr/bin/grep pixelWidth | /usr/bin/awk '{print $2/2}')"

        # Scale the target file.

    /usr/bin/sips --resampleWidth $w "$f"

        # Set the modified and creation date time stamps of the target file to the saved value held in 't'.

    /usr/bin/SetFile -m "$t" -d "$t" "$f"

done
        # Notify User operation is finished.
/usr/bin/afplay "/System/Library/Sounds/Purr.aiff"

Tieni presente che l'ultima riga del codice sopra può essere omessa se intendi utilizzare Mostra notifica growl , che non ho e perché ho utilizzato un suono di sistema. Questo è stato fatto sotto OS X 10.8.5 e dovrai verificare che il percorso degli eseguibili sia lo stesso sul tuo sistema, anche se dovrebbero essere gli stessi. Il motivo per cui sto usando il percorso completo di ogni eseguibile è perché Automator si arresta se non lo faccio. Puoi ottenere l'FQP in un terminale utilizzando which , ad esempio which sips restituisce /usr/bin/sips .

Tieni presente che GetFileInfo e SetFile fanno parte di Xcode Tools e se non sono già installati devi installarlo, il che può essere attivato digitando GetFileInfo in un terminale e seguendo i prompt.

Puoi leggere le pagine del manuale per ciascuno dei comandi utilizzati per ottenere una comprensione più ampia di ciò che sta accadendo.

Pagine di manuale per: GetFileInfo , < a href="https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/sips.1.html"> sips e SetFile

    
risposta data 04.01.2016 - 07:54
fonte
0

Il filesystem in Mac OS X conserva 3 timestamp separati per i file, come segue:

ctime - cambia il tempo (ultimo cambio orario del proprietario del file, permessi

atime - Tempo di accesso (al momento dell'ultimo accesso al file o al contenuto)

mtime - Tempo di modifica (quando i contenuti effettivi sono stati modificati l'ultima volta)

Sebbene queste siano impostate automaticamente durante le varie fasi della vita di un file attraverso l'interazione normale, è importante capire che sono anche tutte modificabili per qualsiasi valore (valido) che si desidera in qualsiasi momento. È possibile sovrascrivere l'ultima ora modificata a una data precedente, se proprio necessario, ecc. Con un semplice comando di terminale:

StuffeMac:~ stuffe$ touch dan.txt
StuffeMac:~ stuffe$ ls -l dan.txt
-rw-r--r--  1 stuffe  staff  0  3 Jan 22:30 dan.txt
StuffeMac:~ stuffe$ touch -mt 201601022359 dan.txt
StuffeMac:~ stuffe$ ls -l dan.txt
-rw-r--r--  1 stuffe  staff  0  2 Jan 23:59 dan.txt
StuffeMac:~ stuffe$ 

Quindi tutto ciò che devi fare è leggere l'ora esistente che desideri memorizzare, apportare le modifiche e quindi ripristinare l'originale. Tutto questo può essere fatto in Automator.

Ti lascio giocare con ottenere il sotto in Automator, perché non ho tempo, ma ecco un modo veloce e sporco (con molti commenti e controlli per assicurarti di capirlo ed è non solo un carico di comandi del terminale) per leggere un timestamp, memorizzarlo in un file per dopo, e quindi riapplicare lo stesso timestamp utilizzando la riga di comando.

Dovresti essere in grado di salvare questi come script brevi modificati per accettare il nome file fornito da Automator), quindi chiamare quegli script come singole azioni di Automator

La cosa complicata è catturare l'intera stringa di date in una volta sola, come puoi vedere il formato cambia, e perdi tempo per visualizzare l'anno per i vecchi file (e come abbiamo appena lanciato nel 2016, quasi tutti i tuoi file mostreranno semplicemente il 2015 invece del timestamp se utilizzi ls ...

drwxr-xr-x+   5 stuffe  staff   170  3 May  2015 Public
-rw-r--r--    1 stuffe  staff     0  2 Jan 23:59 dan.txt

... Quindi puoi usare altri comandi, come getfileinfo invece:

StuffeMac-6:~ stuffe$ getfileinfo -m Public
05/03/2015 13:07:33
StuffeMac-6:~ stuffe$ getfileinfo -m dan.txt
01/02/2016 23:59:00

Quindi, senza ulteriori indugi, ecco un trucco orribile su cui qualcuno può migliorare:

Passaggio 1 , leggi il timestamp e lo memorizza in una variabile e anche in un file in modo che possiamo recuperarlo in seguito

Imposta il file e assegnagli un tempo di modifica precedente come se fosse un vecchio file ed elenca il tempo modificato per dimostrare:

StuffeMac-6:~ stuffe$ touch originalfile.txt
StuffeMac-6:~ stuffe$ touch -mt 201506051200 originalfile.txt
StuffeMac-6:~ stuffe$ ls -l originalfile.txt
-rw-r--r--  1 stuffe  staff  0  5 Jun  2015 originalfile.txt
StuffeMac-6:~ stuffe$ getfileinfo -m originalfile.txt
06/05/2015 12:00:00

Ora leggiamo il timestamp e lo passiamo attraverso un comando chiamato awk un paio di volte per eliminare lo spazio nel timestamp e sostituirlo con due punti, quindi usando / e : come delimitatori, stampare la data nel formato richiesto dal comando touch più tardi ( questo è un po 'sgradevole, ma essenzialmente il primo passaggio senza un delimitatore fornito utilizza uno spazio come predefinito, che sostituisco con un due punti, in modo che il la prossima passata che delimita in modo specifico su : funziona correttamente: non ho potuto ottenere uno spazio e : e / in un passaggio ... - ma la leggibilità era più importante che efficienza ). Fai eco alla variabile per provare che l'hai creata correttamente, quindi esegui il dump in un file in modo da averla in seguito, leggi il file per provarlo:

StuffeMac-6:~ stuffe$ origtimestampvariable='getfileinfo -m originalfile.txt | awk '{print $1":"$2}'|awk -F[/:] '{print $3$2$1$4$5}''
StuffeMac-6:~ stuffe$ echo $origtimestampvariable
201505061200
StuffeMac-6:~ stuffe$ echo $origtimestampvariable > origtimestampvariable.txt
StuffeMac-6:~ stuffe$ more origtimestampvariable.txt
201505061200

Passaggio 2 Ora apporta le modifiche al file

Qui aggiungo semplicemente del testo, ma il tuo Automator farebbe il suo lavoro qui, quindi stamperà i tempi modificati modificati per provarlo.

StuffeMac-6:~ stuffe$ echo "making changes to the file now to change modified time" >> originalfile.txt
StuffeMac-6:~ stuffe$ ls -l originalfile.txt
-rw-r--r--  1 stuffe  staff  55  3 Jan 23:17 originalfile.txt
StuffeMac-6:~ stuffe$ getfileinfo -m originalfile.txt
01/03/2016 23:17:05

Passaggio 3 rimetti indietro il vecchio timestamp

Ora reimposta il timestamp modificato, utilizzando il file touch come mostrato nella parte superiore di questa risposta, ma automatizzando il bit in cui includiamo la data per includere il contenuto del file che ora sappiamo include il timestamp di cui abbiamo bisogno nel corretto formato:

StuffeMac-6:~ stuffe$ touch -mt 'cat origtimestampvariable.txt' originalfile.txt

Altri controlli per dimostrare che il timestamp originale è attivo:

StuffeMac-6:~ stuffe$ ls -l originalfile.txt
-rw-r--r--  1 stuffe  staff  55  6 May  2015 originalfile.txt
StuffeMac-6:~ stuffe$ getfileinfo -m originalfile.txt
05/06/2015 12:00:00
    
risposta data 04.01.2016 - 00:32
fonte
0

È possibile farlo senza la necessità di scaricare Xcode

Con il comando sips nell'azione " Esegui script shell " per sostituire l'azione " Scala immagini "

Lo script usa il comando stat per ottenere le date di creazione e modifica del file e il comando touch per cambiare le date del file.

Lo script di bash:

for f in "$@"
do
    newSize=$(sips -g pixelWidth -g pixelHeight "$f" | awk 'BEGIN{max=0} /pixel/{if(max<$NF){max=$NF}} END{print max/2}')
    if [ $newSize != "0" ]; then
        tDates=($(stat -f "%SB %Sm" -t "%Y%m%d%H%M.%S" "$f"))
        sips -Z $newSize -s formatOptions 95 "$f" && touch -t ${tDates[0]} "$f" && touch -t ${tDates[1]} "$f"
    fi
done

Puoi cambiare la qualità (il numero after -s formatOptions ) 0-100 , l'impostazione predefinita è 80 .

100 = la migliore qualità e il file più grande, 0 = scarsa qualità e file più piccoli.

    
risposta data 06.01.2016 - 22:07
fonte

Leggi altre domande sui tag