Criando script para mover arquivos com base na data ou nome do arquivo

Criando script para mover arquivos com base na data ou nome do arquivo

Eu tenho um processo de FTP que constantemente coloca arquivos em um diretório. A data de criação faz parte do nome do arquivo em um formato como este:

AAAA-MM-DD-HH-MM-SS-xxxxxxxxxx.wav

Gostaria de mover os arquivos para outro diretório com base na data em que o arquivo foi criado. Posso usar o nome do arquivo ou o carimbo de data, o que for mais fácil. Apenas o mês e o ano precisam ser considerados. Eu criei diretórios usando o seguinte formato:

Jan_2016
Feb_2016

Tenho criado diretórios e movido os arquivos manualmente, mas gostaria de automatizar isso com um script bash que criará o diretório se ele não existir.

O que tenho feito até agora é criar manualmente os diretórios e depois executar este comando:

mv ./2016-02*.wav fev_2016/

Responder1

### capitalization is important. Space separated.
### Null is a month 0 space filler and has to be there for ease of use later.
MONTHS=(Null Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)

cd /your/ftp/dir                  ### pretty obvious I think
for file in *.wav                 ### we are going to loop for .wav files
do                                ### start of your loop
    ### your file format is YYYY-MM-DD-HH-MM-SS-xxxxxxxxxx.wav so
    ### get the year and month out of filename
    year=$(echo ${file} | cut -d"-" -f1)
    month=$(echo ${file} | cut -d"-" -f2)
    ### create the variable for store directory name
    STOREDIR=${year}_${MONTHS[${month}]}

    if [ -d ${STOREDIR} ]         ### if the directory exists
    then
        mv ${file} ${STOREDIR}    ### move the file
    elif                          ### the directory doesn't exist
        mkdir ${STOREDIR}         ### create it
        mv ${file} ${STOREDIR}    ### then move the file
    fi                            ### close if statement
done                              ### close the for loop.

Este deve ser um bom ponto de partida para uma pessoa inexperiente. Tente escrever seu script à luz destas instruções e comandos. Você pode pedir ajuda se ficar preso

Responder2

Este script pode ajudar. (por favor, remova o eco dos arquivos mv):

#!/bin/bash

shopt -s nullglob

month=(Jan Feb Mar May Apr Jun Jul Aug Sep Oct Nov Dec)

for y in 2016; do
    for m in {01..12}; do
        fn="$y-$m"
        dn="${month[10#$m-1]}_$y"
        [[ ! -d $dn ]] && mkdir -p "$dn"
        for file in ./"$fn"*.wav; do
            echo mv "$file" "./$dn/${file#\./}"
        done
    done
done

informação relacionada