Atalho para remoção recursiva rápida

5

Às vezes, eu quero excluir grandes faixas de arquivos temporários recursivamente e reciclar o nome do diretório sem esperar que o comando seja concluído. (Por exemplo, se eu quiser refazer e refazer o check-out de uma cópia de trabalho de controle de versão.)

Embora isso não aconteça muitas vezes, quando isso acontece eu costumo usar um comando como:

mv "$oldname" dienow && rm -rf dienow &

Eu poderia criar uma função ou um alias para isso, é claro, mas sem fazer isso existe uma maneira mais curta de expressar o que foi dito acima?

    
por kojiro 04.01.2012 / 16:20

3 respostas

4

Eu ficaria com dois comandos separados:

mv "$oldname" dienow
rm -rf dienow

Dessa forma, se você acidentalmente se lembrar de uma linha do seu histórico, não corre o risco de causar grandes danos executando um único comando. O comando mv não exclui "$oldname" , mesmo que seja a nova versão, e o comando rm exclui apenas algo que você já declarou como excluído.

Se você se sentir com sorte e insistir em um único comando, faça uma função:

mv_then_rm () {
  mv -- "$1" "$1.TO_BE_DELETED" && rm -rf -- "$1.TO_BE_DELETED" &
}

Aqui está uma versão com vários parâmetros que garante que o diretório "a ser excluído" ainda não existe.

mv_then_rm () {
  local d tmpdir tmpdirs
  tmpdirs=()
  for d; do
    tmpdir=$(mktemp -- "$(dirname -- "$d")/.deleting.XXXXXXXXXX")
    tmpdirs+=$tmpdir
    mv -- "$d" "$tmpdir"
  done
  rm -rf -- "$tmpdirs" &
}
    
por 05.01.2012 / 01:35
2

você está perdendo a recriação de "$ oldname".

mv "$oldname" dienow && mkdir "$oldname" && \rm -rf dienow &

Eu prefiro usar o \ rm apenas no caso de alguém ter alias de rm para algo como rm -i

Torne seus caminhos explícitos e adicione como função o perfil

clean_old_now(){
  \mv "$oldname" dienow && mkdir "$oldname" && \rm -rf dienow &
}

Se você está preocupado em fazer isso acidentalmente, adicione um aviso

clean_old_now(){
  read -p "Are you sure?: " sure
  if [[ $? = 0 ]] && [[ "$sure" = "y" ]]; then
    \mv "$workdir/$oldname" $workdir/dienow && mkdir "$workdir/$oldname" && \rm -rf $workdir/dienow &
  fi
}

Ao adicionar caminhos explícitos, certifique-se de que o mv permaneça no mesmo sistema de arquivos para evitar que os dados sejam copiados

    
por 05.01.2012 / 12:00
0

Uma abordagem muito pragmática seria mover o diretório para / tmp e deixar a reinicialização da máquina fazer o resto. Ou estabeleça um cronjob que limpe periodicamente (uma vez por hora).

mv "$oldname" /tmp/forgetme

E como cronjob

0 * * * * rm -rf /tmp/forgetme
    
por 05.01.2012 / 15:36