
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>DD
onde, 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 $newpath
e 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