como manter o arquivo mais antigo no mesmo diretório

0

Eu tinha dois diretórios "../in/" e "../temp/".Minha pergunta é como escrever o script bash para manter os arquivos ou diretórios mais antigos no mesmo diretório ../in/ e arquivos restantes ou diretórios são movidos para o diretório ../temp/.

    
por Bantu 29.06.2016 / 06:33

1 resposta

0

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@ %p
find ../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@ %psort -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@ %p
find ../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.

    
por 29.06.2016 / 07:33