Temos um desfazer no Linux?

Respostas:

53

O Linux (como outras unidades) não fornece nativamente um recurso de desfazer. A filosofia é que, se se foi, se foi. Se fosse importante, deveria ter sido feito backup.

Existe um sistema de arquivos com fusível que mantém automaticamente cópias de versões antigas: copyfs , disponível em todas as boas distribuições. Obviamente, isso pode usar muitos recursos.

A melhor maneira de se proteger contra esses acidentes é usar um sistema de controle de versão (cvs, bazar, darcs, git, mercurial, subversão, ...). Leva um pouco de tempo para aprender, mas vale a pena demais a médio e longo prazo.

Gilles 'SO- parar de ser mau'
fonte
11
boa alternativa pode ser gitfs, que está sob devlopment
test30
11
Bem, se você acidentalmente eliminar ou substituir um arquivo que você não fez estágio ou comprometer ainda, então mesmo uma CVS não ajuda
xdevs23
14

Infelizmente não.

pós-futebolista
fonte
19
Não sei se considero isso infeliz ... Seriam necessários alguns recursos para implementar uma desfazer. Eu nem gosto da -iopção rmativada por padrão. Meus sistemas Unix não devem segurar minha mão.
Xenoterracide
5
-i está ativado por padrão ?! não é minha distro, não senhor!
Stefan
9

Não, não há desfazer mágico em nenhum Unix. O Unix assume que você sabe o que está fazendo. Para suporte ao Desfazer, use um VCS (seu editor de texto provavelmente também o possui).

A maioria dos sistemas de arquivos não tem a capacidade de fazê-lo de forma transparente.

A máquina do tempo e a restauração do sistema no Mac e no Windows, respectivamente, são apenas sistemas de controle de backup / alteração.

xenoterracida
fonte
7

Não há desfazer na linha de comando. No entanto, você pode executar comandos como rm -ie mv -i. Isso solicitará um "você tem certeza?" pergunta antes de executar o comando.

Também é possível adicionar um alias para um script de inicialização (por exemplo, ~/.bashrcou /etc/bash.bashrc):

alias remove='rm -i'
alias move='mv -i'

Editar: pelas sugestões abaixo, removi meu conselho para alias os comandos padrão. Em vez disso, ele introduz novos comandos agora).

vdboor
fonte
11
+1. apenas para adicionar aqui. Após definir os aliases acima, se em alguns casos você deseja remover diretamente sem o prompt "você tem certeza", você pode usar \ rm e \ mv para ignorar o alias. você também pode usar a opção -f.
Hemant
2
mv -isolicita apenas quando substituir um arquivo (o que o torna útil e não desagradável). Na mesma linha alias cp='cp -i',.
Gilles 'SO- stop be evil'
8
Aliasing rm e mv é uma péssima idéia. (rm é pior de tudo.) Nunca adquira o hábito de usar rm para significar rm -i - você o utilizaria em algum lugar onde o alias não esteja definido e você excluirá algo para sempre. Se você gosta de ser solicitado, adquira o hábito de usar rm -i o tempo todo.
msakr
Se você gosta de ser solicitado, use um alias com um nome diferente. Uso move = 'mv -i', copie = 'cp -i', link simbólico = 'ln -si' e instale um comando lixeira para usar em vez de rm. Eu ainda uso mv, cp e rm diretamente durante o script, mas para uso interativo esses aliases são úteis.
@mahmoudsakr Você está completamente certo, eu perdi esse ponto. Também não tenho esses comandos com alias. Aliasing-los como um comando diferente parece ser a opção mais sensata!
vdboor
4

A razão pela qual os sistemas Linux / Unix não têm uma exclusão excluída decorre da maneira como a maioria dos sistemas de arquivos armazena suas informações. As meta-informações do arquivo são todas armazenadas na frente do disco, com referências aos inodes no restante do disco. Normalmente, a maioria dos sistemas de arquivos aloca 10 blocos para um arquivo nessa meta-área. Os 7 primeiros referem-se aos 7 primeiros inodes. Os dias 8 e 9 vão para listas de inodes (blocos duplamente vinculados) e o 10º para uma lista de listas de listas (blocos vinculados tripply). Isso varia de sistema para sistema de arquivos (ext4, jfs, xfs etc.), mas essas listas de blocos geralmente podem endereçar tamanhos de arquivo de 2 GB a vários TB.

Porém, como todas essas informações são armazenadas na frente do disco, quando um arquivo é apagado, não há como referenciar inodes no disco para quais metadados a que eles pertencem. Por outro lado, o FAT32 e o NTFS realmente armazenam algumas informações de cabeçalho nos arquivos, facilitando a identificação de quais arquivos um conjunto de blocos deve pertencer (desde que esse espaço ainda não tenha sido recuperado por arquivos mais recentes). No trabalho do Linux, quando você exclui algo, quase sempre é a primeira coisa a ser substituída imediatamente por novos dados para obter eficiência.

djsumdog
fonte
2

Se você realmente deseja desfazer um recurso, use o controle de origem. O Subversion realmente funciona muito bem em uma máquina de usuário único. Eu o uso para controlar todos os meus arquivos pessoais no meu sistema doméstico. Parece exagero, até um desastre, um script desonesto ou um erro de digitação na linha de comando.

Stephen Jazdzewski
fonte
11
Não vai protegê-lo de rm -r .embora. ;)
Umang
11
@ Umang Na verdade, fiz isso uma vez com o git, onde mantenho um repositório local e acidentalmente rm -r project.git. Felizmente, se você manter uma outra versão em um servidor remoto que é improvável que isso aconteça
phunehehe
11
@phunehehe e quem marcou o meu comentário com +1: estamos muito acostumados ao DVCS para perceber que eu estava completamente errado. O SVN se compromete com o repo (que não é o ramo). Então você estará realmente protegido rm -r .. Realmente estúpido da minha parte.
Umang
2

Uma coisa que gosto de adicionar ao meu .bashrc é uma função de copiar e remover. Algo como:

cprm(){
    cp -p $1 ~/deleted/$1
    rm $1
}

Mas você precisa adquirir o hábito de digitar cprm e não rm.

Obviamente, você precisará manter-se no topo da área excluída se tiver espaço em disco limitado.


fonte
4
você poderia realmente encurtar isso para mv $ 1 ~ / suprimido / $ 1
Stefan
sim, e vai substituir um arquivo 'novo documento 1' com um outro 'novo documento 1', se você começar a citar a direita: "$1".
usuário desconhecido
@userunknown: você quer dizer $ 1 no código de Deano e Stefan deve ser citado como "$ 1"?
Tim
@ Tim: Sim, eu faço.
desconhecido usuário
Por que não mover em vez de cp e rm?
user1559897