SCRIPTS per TOUCH

1

Ho visto un comando utile come questo:

for f in *; do t=$(echo $f | sed -E 's/[-. mov]//g'); touch -t $t "$f"; done

Che cosa devo cambiare in quel comando, per mantenere solo la stringa "time stamp" per un file con la seguente convenzione di denominazione?

aaaa@XXXXXX(XXXXXXX)_20170201101315.mp3
    
posta Gianky Funky 03.02.2017 - 18:32
fonte

2 risposte

0

Avrei un approccio un po 'diverso, in quanto vorrei testare che il nome del file termina in .mp3 e la lunghezza della variabile t è di 12 caratteri prima dell'elaborazione. Ciò dovrebbe impedirgli di agire su file che non sono conformi al modello ed evitare di lanciare errori, anche se gli errori in questo caso dovrebbero essere non fatali. Non mi piace la roba inutile emessa.

Questo è un esempio di esso sotto forma di script:

#!/bin/bash

for f in *.mp3; do
    t="$(awk '/_.*/ { match($0, /_.*/); print substr($0, RSTART + 1, RLENGTH - 7); }'<<<"$f")"
        if [[ ${#t} -eq 12 ]]; then
            touch -t "$t" "$f"
        fi
done

Questo è un esempio di script come one-liner, anche se molto lungo.

for f in *.mp3; do t="$(awk '/_.*/ { match($0, /_.*/); print substr($0, RSTART + 1, RLENGTH - 7); }'<<<"$f")"; if [[ ${#t} -eq 12 ]]; then touch -t "$t" "$f"; fi; done

Che può essere abbreviato in:

for f in *.mp3; do t="$(awk '/_.*/ { match($0, /_.*/); print substr($0, RSTART + 1, RLENGTH - 7); }'<<<"$f")"; [[ ${#t} -eq 12 ]] && touch -t "$t" "$f"; done

Se vuoi davvero abbreviare ulteriormente:

for f in *; do t="$(awk '/_.*/ { match($0, /_.*/); print substr($0, RSTART + 1, RLENGTH - 7); }'<<<"$f")"; touch -t "$t" "$f" 2>/dev/null; done

Il precedente modulo del comando composto non esegue il controllo degli errori e reindirizza l'output dell'errore del comando touch in modo da non ingombrare lo schermo. Questa forma va bene in questo caso d'uso in quanto un comando tattile malformato sarà non fatale.

    
risposta data 03.02.2017 - 21:55
fonte
1

Puoi esercitarti sulla riga di comando per ottenere uno script sed di lavoro:

$ echo "aaaa@XXXXXX(XXXXXXX)_20170201101315.mp3" | sed -e "s/^.*_//g" -e "s/\.mp3$//g"
20170201101315

Poiché il timestamp nel tuo nome file include i secondi e non è in un formato che accetta accetta (vuole un '.' prima dei secondi), li escludo con un taglio:

for f in *; do t=$(echo $f |  sed -e "s/^.*_//g" -e "s/\.mp3$//g" | cut -c -12); echo touch -t $t "$f"; touch -t $t "$f"; done
    
risposta data 03.02.2017 - 21:30
fonte

Leggi altre domande sui tag