Resumo : A solução mais completa é a última, escolha aquela que melhor lhe convier, dependendo do que exatamente você deseja fazer.
Na verdade, se tudo o que você deseja é manter um arquivo por mês, basta renomear todos os arquivos month . Isso substituirá tudo, exceto um arquivo por mês. Você não deu informações sobre o tipo de arquivo ou onde esses arquivos estão. Estou assumindo que todos os arquivos estão no mesmo diretório e não há subdiretórios. Se isso estiver errado, atualize sua pergunta com mais detalhes e atualizarei minha resposta.
for file in *; do
month=$(date -d 'stat -c %y $file | cut -f 1 -d ' ' ' +%B);
mv $file $month;
done
O script acima deixará você com arquivos chamados January , February etc. Se você precisar manter os nomes dos arquivos originais, você pode tentar:
for file in *; do
month=$(date -d 'stat -c %y $file | cut -f 1 -d ' ' ' +%B);
rm *.$month;
mv $file $file.$month;
done
Isso deixará você com arquivos chamados <FILENAME>.<MONTH> , por exemplo, foo.January .
Ambas as soluções acima são muito simplistas. Uma solução mais geral que também funcionará em arquivos em sub-diretórios e ignora arquivos com menos de um mês de idade é:
find . -type f -mtime +29 | while IFS= read -r file; do
month=$(date -d 'stat -c %y "$file" | cut -f 1 -d ' ' ' +%B);
find . -type f -name "*$month" -delete
mv "$file" "$file.$month";
done
NOTAS:
-
A solução acima procurará arquivos com pelo menos um mês de idade no diretório atual e em todos os subdiretórios e manterá apenas um arquivo por mês. Isso significa que, se você tiver dois arquivos que foram modificados pela última vez em janeiro, um deles é
./fooe o outrobaz/bar, apenas um será mantido, seja./foo.Januaryoubaz/bar.January. -
Isso pressupõe que você não tenha arquivos do ano passado que possam ser denominados
foo.January. Se você fizer isso, eles serão excluídos.
Por fim, um pouco mais complexo que permitirá que você mantenha os nomes dos arquivos inalterados e evite os problemas mencionados acima:
tmp='mktemp -u XXXX';
find . -type f -mtime +29 | while IFS= read -r file; do
date=$(date -d 'stat -c %y "$file" | cut -f 1 -d ' ' ' +%B%Y);
foo=$tmp"_"$date;
find . -type f -name "*$foo" -delete
mv "$file" "$file.$foo";
done
find . -type f -name "*$tmp*" | while IFS= read -r file; do
mv "$file" "${file%.*}";
done
EXPLICAÇÃO:
Este script usa mktemp -u XXXX (por exemplo, Xy12 ) para gerar uma string aleatória que é então combinada com a data (por exemplo, January2008 ) do arquivo. Todos os arquivos com pelo menos um mês (> 29 dias, desculpe, fevereiro) são renomeados para filename.Xy12_January2008 . O segundo loop localiza todos os arquivos cujo nome contém a string aleatória ( Xy12 ) e remove sua extensão, portanto filename.Xy12_January2008 torna-se filename novamente.
O resultado final é um arquivo de cada mês de cada ano, com o nome do arquivo original inalterado. O script pode lidar com nomes de arquivos com espaços e encontrará arquivos no diretório atual e em todos os subdiretórios.