Como posso classificar imagens do terminal?

1

Eu tenho muitas imagens com timestamp:

cloudcam-20130825T115716Z.jpg

Na mesma pasta, gostaria de criar uma pasta com o nome da data ( 20130825 ) e mover todas as imagens para esta pasta.

Existe uma maneira fácil de fazer isso?

    
por OHLÁLÁ 05.09.2013 / 14:13

3 respostas

1

Diga-me se isso funciona (não testado;)):

for f in 'ls cloudcam-????????.jpg'; do
    name='echo "$f"|sed 's/ -.*//''
    datedir='echo "$name"|cut -c 10-17'
    dir="DestinationDirectory/$datedir/$name"
    mkdir -p "$datedir"
    mv "$f" "$datedir"
done

.. ele deve copiar todos os jpg's começando com cloudcam-, criar um diretório para a posição 10 a 17 do nome do arquivo, criar o diretório e mover o arquivo. Então, se você tiver imagens com outra data, elas serão colocadas em outro diretório.

Salve e torne o script executável com o chmod 775.

Tente primeiro em uma cópia dos seus arquivos.

    
por Rinzwind 05.09.2013 / 15:04
3

Você pode usar um loop for ...

  • teste primeiro para ter certeza de que lista tudo o que você precisa

    for i in cloudcam-20130825*; do echo $i; done
    
  • mova imagens

    for i in cloudcam-20130825; do mv $i 20130825; done
    
por mikewhatever 05.09.2013 / 14:23
1

Você pode mover todos os arquivos correspondentes com um simples shell glob

$ mkdir 20130825
$ mv cloudcam-20130825*.jpg 20130825

Isso funcionará desde que não haja milhares de arquivos (caso em que pode ser necessário "agrupar" os movimentos usando find -exec mv ... + ou xargs )

Se você tem um monte de diferentes datas e deseja analisar os nomes dos arquivos na hora e criar diretórios conforme necessário, você pode fazer algo como

for f in cloudcam-*.jpg; do d="${f:9:8}"; [[ ! -d "$d" ]] && mkdir "$d"; mv -t "$d" "$f"; done

Isso pressupõe que os nomes dos arquivos sejam exatamente como mostrados em sua postagem original, ou seja, que o carimbo de data é yyyymmdd começando no caractere # 9 - se esse não for o caso, são possíveis parsings mais sofisticados, e. usando construções bash como ${f#front} e ${f%%back} para remover substrings iniciais e finais.

    
por steeldriver 05.09.2013 / 15:00