bash script usando awk para renomear o arquivo usando timestamp

0

Comecei a trabalhar em um script para renomear arquivos com base no timestamp. Eu pensei que tinha funcionado na linha de comando, mas não funcionando como um script. Script trava na linha do awk.

Este é o pequeno roteiro até agora.

#!/bin/bash
#renamePhotos.sh
#  a script to rename photos in current directory based on date
#  to be expanded

#  OUTPUT in $(ls -tr *.JPG); 
LIST="$(ls --full-time -tr *.JPG)"
echo "Starting..."

for i in "$LIST"; do
    echo  $(awk '{ print $6 }' | awk 'BEGIN { FS = "-" }; { print $1 }')
    echo
done
    
por RGB 24.08.2016 / 05:47

1 resposta

1

Nesta linha:

echo  $(awk '{ print $6 }' | awk 'BEGIN { FS = "-" }; { print $1 }')

O primeiro awk dentro da substituição do comando não tem nenhuma entrada especificada, então ele lê a partir do stdin, que está conectado ao seu terminal, o que significa que ele espera que você dê alguma entrada.

Para dar uma entrada da variável do shell, é provável que você queira inseri-la em:

echo "$var" | awk...

Fazer echo $(foo bar) parece estranho, pois o echo apenas imprimirá a saída do comando foo bar , o que aconteceria em qualquer caso se você executasse foo bar sozinho. (Além da divisão de palavras, mas é provável que não fosse o que você estava procurando.)

Além disso, o loop for.

for i in "$LIST"; do

será executado apenas uma vez, com i definido para o valor de LIST . Como $LIST é citado, ele não passa pela divisão de palavras e for vê apenas um item na lista. No entanto, se você fizer isso sem aspas, como em for i in $LIST; do... , verá que ele também se divide nos espaços. Você precisaria definir IFS como uma nova linha para impedir isso.

Mesmo depois disso, há o possível problema que a saída de ls pode ser um pouco complicada: o formato de hora pode mudar de acordo com a localidade (embora eu não tenha certeza se isso acontece com --full-time ), e pode mangle caracteres não imprimíveis em nomes de arquivos. Se você conhece sua localidade e se os nomes dos arquivos são "legais", pode funcionar.

Uma alternativa seria deixar o shell localizar os arquivos e usar algo como date --reference $file (se você tiver isso), para obter a data:

for f in *.jpg ; do 
    d=$(date +"%Y-%m-%d" -r "$f")  
    echo "$d $f" 
done

(GNU coreutils date tem o --reference flag. date -r no OS X leva um tempo em vez de um arquivo.)

    
por 24.08.2016 / 16:08

Tags