Organizando arquivos por datas contidas neles

Organizando arquivos por datas contidas neles

Atualmente estou tentando escrever um script que organize uma lista de arquivos em subdiretórios por datas. As datas estão contidas na primeira linha de cada arquivo no formato YYYY-MM-DD. Extraí a primeira linha de cada arquivo usando o comando head e substituí -por /para que se torne YYYY/MM/DD. Isso é para que eu possa usá-lo como caminho de arquivo.

Quero então criar subdiretórios YYYY>MM>DDonde, por exemplo, o arquivo que contém a data 2015/10/19é armazenado no caminho do arquivo ./2015-> ./2015/10-> ./2015/10/19. Esses subdiretórios devem ser criados em ~/fileList/.

Este é o código que tenho até agora.

for file in ~/fileList/*
do
   head -1 $file | tr "-" "/")
done

Este é um arquivo de amostra

2001-02-03
Thursday
Paris
44952

Estou lutando para encontrar uma maneira de criar os subdiretórios e armazenar cada arquivo no diretório correto. Qualquer sugestão de código seria muito apreciada.

Estou usando o shell bash.

Responder1

O seguinte deve ser feito:

for file in ~/fileList/*
do
    newpath=$(head -1 "$file" | tr '-' '/')
    mkdir -p "$newpath"
    echo "would now execute 'mv $file $newpath'"
done

Isso armazenará a data transformada na variável $newpathe criará esse diretório junto com quaisquer pais ausentes, se ainda não existir. O subdiretório será criado no diretório onde você executa o script.

Em sua forma atual imprimirá o comando que seria executado. Quando estiver satisfeito, mude para

mv "$file" "$newpath"

Atualizar:Como você declarou que os diretórios de destino estarão localizados abaixo do diretório de origem onde seus arquivos residem originalmente, são necessárias verificações para garantir que, caso você execute o script várias vezes, ele não encontrará essas entradas recém-geradas.

  • Se você conseguir identificar os arquivos pela extensão (por exemplo, .txt), poderá tornar o loop mais específico:
    for file in ~/fileList/*.txt
    do
        newpath=~/fileList/$(head -1 "$file" | tr '-' '/')
        ...
    done
    
  • Caso contrário, uma maneira é aceitar apenas arquivos regulares como operandos:
    for file in ~/fileList/*
    do
        if [[ ! -f $file ]]; then continue; fi
        newpath=~/fileList/$(head -1 "$file" | tr '-' '/')
        mkdir -p "$newpath"
        mv "$file" "$newpath"
    done
    

informação relacionada