Em primeiro lugar, é uma boa idéia para analisar a saída de ls
, pois pode levar a todos os tipos de problemas. A melhor maneira de obter a idade de um arquivo é stat
. Por exemplo:
$ ls -l 20120322222.log
-rw-r--r-- 1 terdon terdon 0 Jan 1 2012 20120322222.log
$ stat -c %y 20120322222.log
2012-01-01 00:00:00.000000000 +0100
Então, agora sabemos como obter a idade do arquivo, a questão é como converter isso em um nome de mês com três letras. O mais fácil é usar date
:
$ date -d "2012-01-01" +"%b"
Jan
A combinação dos dois comandos fornece:
$ date -d "$(stat -c %y 20120322222.log)" +"%b"
Jan
Então, com isso em mente, você pode escrever seu script como:
#!/usr/bin/env bash
BASE_DIR=/home/Work/LogFiles
## Find those files that are older than a month
find "$BASE_DIR" -maxdepth 1 -mtime +30 -type f -name "20*" |
while IFS= read -r file; do
## Get the file's modification year
year="$(date -d "$(stat -c %y "$file")" +%Y)"
## Get the file's modification month
month="$(date -d "$(stat -c %y "$file")" +%b)"
## Create the directories if they don't exist. The -p flag
## makes 'mkdir' create the parent directories as needed so
## you don't need to create $year explicitly.
[[ ! -d "$BASE_DIR/$year/$month" ]] && mkdir -p "$BASE_DIR/$year/$month";
## Move the file
mv "$file" "$BASE_DIR/$year/$month"
done
O script acima assume que você deseja obter uma data de modificação real dos arquivos, e não analisar o nome. Se você quiser analisar o nome, me avise e eu modificarei de acordo.