Existem maneiras mais simples de fazer isso, se é possível supor que nenhum nome de arquivo tenha espaço em branco ou novas linhas em seu nome. No mundo moderno, não se pode supor isso e, além disso, é uma má forma escrever scripts tão frágeis que eles falharão se esse nome de arquivo legal for encontrado.
Por segurança, use o seguinte (ferramentas GNU podem ser necessárias):
find ../ini/ -type f -printf '%T@ %pfind ../ini/ -type f -printf '%T@ %p\n' | sort -n | sed -En '2,$s/[^ ]* //p' | xargs -d'\n' mv -t ../temp/
' | sort -nz | sed -Ezn '2,$s/[^ ]* //p' | xargs --null mv -t ../temp/
Isso move todos os arquivos, exceto o mais antigo, em ../ini/
para ../temp/
.
Como funciona
-
find ../ini/ -type f
Isso encontra todos os arquivos regulares no diretório
../ini
. -
-printf '%T@ %p
sort -nz
'Imprime o registro de data e hora e o nome dos arquivos encontrados em uma sequência separada por nul.
-
sed -Ezn '2,$s/[^ ]* //p'
Isso faz uma classificação numérica na string separada por nul. Quando isso é feito, o arquivo mais antigo é listado primeiro.
-
xargs --null mv -t ../temp/
Isso imprime todos os nomes de arquivos, exceto o primeiro. Também remove o timestamp.
-
mv
Isso executa um comando
../temp/
nesses arquivos, enviando-os para o diretório%code%
.
Usando ferramentas que não suportam itens separados por nul
As ferramentas assumidas acima que suportam %code% separaram itens. Versões modernas do Linux (GNU) suportam isso. Ao usar um sistema operacional que não, há várias soluções alternativas. Os itens a seguir usam itens separados por nova linha e, portanto, devem ser compatíveis com ferramentas antigas:
find ../ini/ -type f -printf '%T@ %pfind ../ini/ -type f -printf '%T@ %p\n' | sort -n | sed -En '2,$s/[^ ]* //p' | xargs -d'\n' mv -t ../temp/
' | sort -nz | sed -Ezn '2,$s/[^ ]* //p' | xargs --null mv -t ../temp/
Isso falhará se algum arquivo tiver nomes que contenham novas linhas.