Remove o último arquivo modificado

1

Eu criei dois arquivos: sample.txt e sample.txt  (o segundo arquivo contém alguns caracteres ocultos, por exemplo, um espaço). Como posso remover o arquivo modificado mais recente? Estou usando o Linux.

    
por teja 22.03.2016 / 00:18

5 respostas

2

stat é o ingrediente principal desta receita: remova o echo se estiver satisfeito de que está funcionando

echo rm "$(stat -c "%Y:%n" * | sort -t: -n | tail -1 | cut -d: -f2-)"

Você não especifica sua plataforma: estas são as ferramentas Linux e GNU.

Observe que isso não funciona se o nome do arquivo contiver uma nova linha.

    
por 22.03.2016 / 01:43
2

A maneira simples e confiável de excluir o arquivo mais recente no diretório atual é

zsh -c 'rm ./*(om[1])'

Claro, se você estiver executando o zsh, isso é apenas

rm ./*(om[1])

Ao contrário de outras soluções propostas neste tópico, como analisando a saída de ls ou de stat , isso funciona não importa quais caracteres estranhos o nome do arquivo contenha, mesmo caracteres não imprimíveis, até mesmo novas linhas.

Os caracteres entre parênteses após * são qualificadores da glob. om significa classificar por hora de modificação (mais recente primeiro) e [1] significa selecionar apenas o primeiro arquivo (após a classificação).

Se o que você quer é se livrar de um determinado arquivo, confiar no tempo de modificação é uma abordagem complicada. Em vez disso, digite rm Espaço Tab e navegue pelas completações que o seu shell oferece até você acertar o arquivo correto.

    
por 22.03.2016 / 02:36
1

Se você deseja remover o arquivo mais recente em um diretório chamado dir e o nome do arquivo não contém um caractere de nova linha, faça o seguinte:

rm -i -- "$(LC_CTYPE=C ls -t dir | head -1)"

Tenha em atenção que, se o nome do ficheiro contiver caracteres não imprimíveis, isto poderá não funcionar porque ls pode manchar os caracteres não imprimíveis.

Se o arquivo mais recente no diretório for outro diretório, você receberá um erro, como rm: cannot remove ‘dir2’: Is a directory .

    
por 22.03.2016 / 01:08
0

Não há uma maneira direta (portátil) de fazer isso. Mas se uma das soluções em Unix / Linux encontrar e ordenar por data modificada (que não tem resposta aceita) funciona para você, então você faria algo como

rm -f "$(find-sorted-list | head -n 1)"

onde find-sorted-list pode incluir um timestamp que deve ser cortado da frente da linha, por exemplo, com um estágio envolvendo sed.

sed -e 's/^[^ ]* //'

para apenas dígitos e dois pontos.

Como a pergunta especificou que o nome do arquivo contém um espaço (entre outros caracteres), uma solução usando xargs parece estar descartada.

    
por 22.03.2016 / 01:19
0

Aqui está uma função do shell que depende do utilitário stat ; chame-o com um parâmetro de diretório opcional (o padrão é . , o diretório atual) e ele executará um rm interativo do arquivo mais antigo. Para jogar um pouco de cautela ao vento, remova o -i flag para rm . Ele intencionalmente ignora diretórios e, portanto, investiga apenas arquivos no diretório fornecido. Para lidar de maneira limpa com diretórios vazios, adicionei algumas shopt de soluções alternativas. Isso deve, no entanto, lidar (assim como pode) com arquivos que possuem espaços e novas linhas em seus nomes.

function rmoldest {
  shoptnow=$(shopt -p nullglob)
  shopt -s nullglob
  tstamp=$(date +%s)
  file=
  dir=$1
  dir=${dir:-.}

  for f in "$dir"/*
  do
    if [ ! -d "$f" ]
    then
      y=$(stat -c "%Y" "$f")
      if [ $y -lt $tstamp ]
      then
        file="$f"
        tstamp=$y
      fi
    fi
  done
  $shoptnow
  if [ -n "$file" ]
  then
    /bin/rm -i "$file"
  fi
}

Aqui está uma amostra de execução (os $ principais são meus prompts do shell, não os digita):

$ touch sample.txt; sleep 1; touch 'sample.txt '

$ ls -l
total 0
-rw-r--r-- 1 Jeff None 0 Mar 21 22:02 sample.txt
-rw-r--r-- 1 Jeff None 0 Mar 21 22:02 sample.txt

$ rmoldest
/bin/rm: remove regular empty file ‘./sample.txt’? y

$ ls -l
total 0
-rw-r--r-- 1 Jeff None 0 Mar 21 22:02 sample.txt

$ rmoldest
/bin/rm: remove regular empty file ‘./sample.txt ’? y

$ ls -l
total 0
    
por 22.03.2016 / 03:00