Intenção:
rm -rf string*
Problema:
rm -rf string *
O primeiro caso é um uso legítimo e comum da rm, um pequeno erro de digitação pode causar muitos problemas no segundo caso. Existe uma maneira simples de proteger com inteligência contra um curinga acidental à direita ou à direita?
zsh
oubash
) Eu preferiria tomar o hábito de pressionar a tecla Tab (para acionar auto-realização) antes de pressionar a tecla Entertouch -- -i
criará um arquivo-i
que será passadorm
como parâmetro-i
quando você incluir um curinga em seus argumentos.rm *
. Se você digitarrm name *
, ele será expandido pararm name -i other names
.-i
não será processado como uma opção, porque não é antes dos nomes dos arquivos.Respostas:
Uma
DEBUG
armadilha pode ser gravada para cancelar comandos que parecem suspeitos. O seguinte, ou código semelhante, pode ser adicionado ao seu~/.bashrc
:Ajuste a lógica a gosto.
(Na verdade, não espero que essa abordagem seja útil - muitas maneiras de atrapalhar um comando destrutivamente para encontrá-los testando um por um - mas fornece uma resposta literal à pergunta).
fonte
Não há como um sistema totalmente à prova de balas. E adicionando "Você tem certeza?" solicitar informações é ao mesmo tempo contraproducente e leva a "Claro que tenho certeza". reações no joelho.
Um truque que aprendi em um livro nos últimos anos é fazer primeiro
ls -R blah*
, fazerrm -fr blah*
se, e somente se, a listagem que apareceu apareceu no que eu queria.É fácil o suficiente executar o
ls
comando primeiro e, em seguida ↑, excluirls -R
e substituir porrm -fr
.A pergunta final é: "Se a informação foi valiosa para você, onde está seu backup?"
fonte
^ls -R^rm -rf^
e talvez definir como um aliasls -R
que eu basicamente faço o tempo todo, mas é tão instintivo neste ponto que deslizou minha mente consciente quando me formei pela resposta. Então, +1 para isso.cat > .log
, depois volto e colo ou puxo o nome do arquivo antes do.log
. Então, em nenhum momento eu tenho> valuablefile
o cmdline.rm -i
, então geralmente componho meu comando rm e depois coloco um\
no início da linha. (\rm
evita expansão de alias para rm, já que parte da palavra foi citada). Se eu precisasse de um-r
ou-f
, sim, às vezes começo com, emls
vez derm
, ou simplesmente deixo de fora a-rf
parte. ? (editar, como você começa uma barra invertida code-formatação bquote bslash bslash bquote falhar.Você pode treinar para usar, digamos,
rmrf
no lugar derm -rf
?Nesse caso, essa função bash fornecerá uma chance de ver o que realmente aconteceria antes de confirmar o comando:
Para tornar essa função permanente, adicione esta linha ao
~/.bashrc
arquivo em cada computador que você usa.Comparação com o
rm
alias comumÉ comum definir um alias:
Isso tem duas limitações:
Se você depender desse alias, sofrerá um choque quando estiver em uma máquina ou em um ambiente que não o possui. Por outro lado, tentar executar
rmrf
uma máquina sem essa função retornará um efeito inofensivocommand not found
.Esse alias não ajuda no seu caso, porque a
-f
opção que você fornece na linha de comando substitui a-i
opção no alias.fonte
rm -rf
comando errado , o que acontece? A criação de pseudo-funções como essa acaba por complicar uma solução simples: tenha mais cuidado e entenda o que são permissões.rmrf
, em vez de apenas criar uma função shellrm
que verifica os argumentos-r
ou-rf
, e executa uma lógica especial nesse caso, caso contrário, chamava diretamentecommand rm "$@"
para chamar orm
comando real ?-f
se não tiver-i
. Sair-f
dá um aviso extra antes de remover um arquivo somente leitura, por exemplo.Se estou em uma situação onde apagar os arquivos errados é realmente um grande negócio, uma das coisas que eu tenho feito é fazer uma pasta de lixeira, como
mkdir trashcan
, e então eu tenho um scriptrmTrashcan
que tem umrm -rf trashcan/*
ourm -rf *
ou similar, escrito com muito cuidado e verificado várias vezes.Dessa forma, se eu cometer um erro, o erro está em um
mv
comando, não em umrm
comando. Uma vez que eu façols
e confio exatamente no que estou excluindo, um trabalhormTrashcan
realmente sujo é feito com segurança.Também foi tremendamente conveniente para uma situação em que tive que excluir backups. Eu pude
mv
um mês inteiro de backups na lixeira,mv
os poucos que eu queria manter (1º de mês, 15 de mês) de volta nos backups, depoisrmTranshcan
o resto. É difícil fazer um comando semelhanterm
por si só, e dessa maneira, deixols
os backups confiantes nos arquivos que estou deixando para trás (em vez de apenas enumerar os arquivos que pretendo excluir)fonte
Em vez de me preocupar com dois comandos (
ls
erm
), acho que uma maneira mais simples e fácil é usarfind
:Se você digitar acidentalmente,
"string *"
ele excluirá os arquivos nomeadosstring chars
estring letters
(que é o que você queria mesmo), mas não capturará todos os arquivos como*
em um shell.Além disso, você pode deixar
-delete
de ver quais arquivos serão excluídos e pressionar a seta e digitar com-delete
mais facilidade do que digitar^ls -R^rm -rf
ou outras bobagens.fonte
find
fará uma pesquisa aninhada por arquivos que correspondam ao invés dos parâmetros explícitos declarados na linha de comando. Eu acho que isso erra o alvo. Eu posso estar errado embora.Na verdade não. É proposto em outra resposta que você pode criar um comando personalizado para adicionar um prompt antes de executar uma tarefa. Mas o problema com este comando personalizado é que ele deve ser instalado conscientemente nos sistemas em que você está trabalhando. E mesmo que esteja instalado, o problema é o seu reflexo ao acertar
y
para concluir a tarefa e pode entrar em jogo.Isso significa que tudo isso é um problema da interface do usuário, mesmo que esteja no nível de texto / linha de comando. Quantas redes de segurança você espera que exista para protegê-lo de fazer algo que não deveria? É como uma tesoura: se você é negligente, escorregou e cortou a mão enquanto pretendia cortar pano ou papel, quem é o culpado? Ou até mesmo semáforos e sinais de parada: não há realmente nada que impeça um motorista de acender um semáforo ou ignore os sinais de trânsito além de uma percepção aguda do que pode acontecer se eles se envolverem em um comportamento tão arriscado.
Dito isto, a melhor solução realista está nas permissões do sistema para usuários e grupos. Essa é a melhor / única rede de segurança real para proteger um usuário de si mesmo.
Se você estiver trabalhando em um sistema em que é o único a acessá-lo, poderá ficar tentado a
chmod 777
tudo, mas não é assim que um sistema racional é configurado. Em vez disso, as permissões devem ser algo como755
para todos os diretórios e644
todos os arquivos não executáveis. Os arquivos executáveis devem ter755
no mínimo, mas talvez até mesmo744
se você quiser que outras pessoas leiam, mas não os executem.fonte
Tente compor seu
rm
comando inicial sem o-f
sinalizador, mas, em-i
vez disso,rm
será solicitado que você solicite cada arquivo que pretende excluir. Para pequenas exclusões recursivas, você pode manter pressionada a ytecla quando tiver certeza de que o comando foi digitado corretamente. Para exclusões grandes, é possível interromper a operação e usar o histórico da linha de comando para alterar cuidadosamente-i
para a-f
.fonte
y[RETURN]
todos os arquivos, não há nada que possa conter com o GNU rm. A edição-i
do caminho é o caminho a seguir, depois de digitar o comando corretamente. Em seguida, você recebe um prompt apenas em um arquivo somente leitura e talvez outras coisas.rm -I
para que ele só pede uma vez, e apenas para eliminações potencialmente perigosos (ou seja, de muitos arquivos.)rm tem
-i
e-I
sinalizadores para confirmar antes de cada remoção. No passado, algumas distribuições as ativavam por padrão. Esta é uma péssima ideia. Dê ao usuário muitas caixas de diálogo de confirmação para operações normais e elas começarão a confirmá-las habitualmente. Isso apenas muda o requisito de "ter cuidado" (sempre uma bandeira vermelha) para um novo e mais irritante diálogo. "Sim. Sim. Sim. Sim! SIM! Meu Deus, computador estúpido, basta excluir os arquivos YESYESYESYESYES - CRAP EU QUERO NÃO! NOOOOOOO!" Esse é o problema do diálogo "Sim, mas não quis dizer". Esta resposta fornece uma explicação visual do motivo pelo qual as caixas de diálogo de confirmação aparecem na hora errada.O tipo de erro que você descreve é um deslize , "a execução de uma ação que não era o que se pretendia". O usuário normalmente reconhece imediatamente o erro e sabe exatamente como corrigi-lo. Infelizmente, o Unix não oferece ao usuário a oportunidade, rm exclui o arquivo imediatamente. Todos os outros sistemas operacionais resolvem esse problema, permitindo que as exclusões sejam desfeitas, pelo menos por um tempo, pelo uso da Lixeira.
Existem vários sistemas de lixo para o Unix, e esta resposta está cheia de sugestões .
A questão é alias rm ou não alias rm. Prós para aliasing rm ...
Contras de aliasing rm ...
Se você seguir o primeiro argumento longe demais, acabará usando vi (não vim, vi), csh (não tcsh, csh) e outros utilitários antiquados porque eles estão disponíveis universalmente. Ainda assim, existe o risco de supercustomizar seu ambiente. Prefiro levar meus utilitários comigo e tornar isso o mais fácil possível. YMMV.
Dois e três são problemas técnicos. Eles podem ser resolvidos com um trabalho inteligente de ceifeira que verifica o tamanho do lixo e limpa as coisas periodicamente, semelhante a um tmpreaper . Pode ser uma tarefa cron, ou uma versão mais inteligente pode fazer uso das várias infraestruturas de eventos do sistema de arquivos disponíveis em muitas distribuições de desktop Linux. Isso não é simples e ainda mais difícil de ser feito com eficiência. É melhor encontrar um sistema existente do que tentar criar o seu próprio.
O quarto pode ser resolvido transformando seu novo rm em um alias de shell
alias rm='trash'
; portanto, ele não afetará os programas.O quinto é um problema que deixo para o leitor resolver. O rm não possui muitos switches.
fonte
rm -i
, mas geralmente uso\rm
para obter um comportamento sem alias . Eu digito arm -i
qualquer momento que estou planejando dizer não a um dos argumentos. Às vezes, inicio o comando comls
o comando e só coloco o comando quando terminar. Portanto, não há como acidentalmente obter retorno emrm -rf /
vez de/.../file
rm -I
ourm --interactive=once
é muito, muito menos irritante do querm -i
, e ainda pega aything perigosas (só prompts quando há mais de 3 arquivos, ou se é recursiva, e apenas uma vez, em vez de para cada arquivo.)-i
pode dar ao usuário tempo para alterar metas. Esta resposta em uma pergunta relacionada explica tudo.rm -i
por mais de 30 segundos sem desligá-lo. Considerando querm -I
apenas solicita quando é provável que você tenha estragado tudo; o prompt aparece apenas para grandes exclusões. Quando você estava tentando excluir algumas coisas e o aviso foi dado, você ficou surpreso e percebeu que digitou acidentalmente "foo *".-rf
que acabei de descobrir) são proxies ruins para detectar um possível erro. Não é provável que você queira excluir um subdiretório. A mensagem não ajuda porque apenas confirma o que o usuário disse para fazer sem adicionar informações úteis em um momento em que o usuário não está procurando verificar. "rm: remove 1 argumento recursivamente?" "Sim, exclua o diretório, eu apenas lhe disse para fazer isso! ... espere, qual diretório era esse? EXCREMENTO !!!"Eu ensino a todos sobre o
!$
argumento = last no último truque de comando:Isso permite uma inspeção da expansão do curinga e, em seguida, o uso exato do mesmo padrão glob sem a possibilidade de inserir um espaço antes do
*
.Também sugiro que as pessoas nunca cortem e colem um padrão curinga brilhante em uma linha de comando potencialmente destrutiva. Porque nas minhas próprias mãos isso tem sido um problema :)
Um técnico em meu laboratório acabou de cometer esse erro na semana passada (3 meses de trabalho) - e sim, tivemos um backup (1 dia atrasado).
fonte
Todo mundo parece estar dizendo: "Seja mais cuidadoso", "Não faça um pedido de alias / confirmação, porque você se acostumará a não prestar a devida atenção a ele".
Legal, e tudo. Quero dizer, não acho que você deva criar um apelido para
rm
(nemrmrf
, já que você pode facilmente estragar tudo e digitar o comando real).Mas por que você não pode criar um apelido / script e chamá-lo, digamos,
remove
e alimentá-lo apenas com um argumento (por exemplo, $ 1)? O curinga deve ser $ 2, por causa do espaço inadvertido (correto?) E, portanto, seu script / wrapper / alias não será alimentado pelo segundo. Sim, você pode fazer apenas um conjunto de exclusões (com um curinga) por vez, mas esse é o preço que você pagaria.Se eu estivesse escrevendo algo legal, poderia me dizer o número de arquivos e diretórios que está planejando excluir e o tamanho total das coisas que eu estava excluindo e pedir uma confirmação, mas isso pode impedir seu fluxo. Talvez faça disso uma opção de sinalização
remove
? (-Eu). Você também pode verificar $ 1 para ver se é apenas um curinga e pedir uma confirmação, e listar em qual diretório você está.Como um aparte, há uma série de
rm
substituições por aí. Muitos estão tentando ser compatíveis com o lixo da área de trabalho da interface do usuário. Alguns desses podem valer a pena investigar.fonte
remove \*
? Se o seu script permite que o shell expanda sua entrada, não o vejo ajudando muito.Um truque muito simples é colocar
-rf
no final:rm whatever* -rf
isso reduz drasticamente a taxa de erro, porque você digita mais caracteres após o
*
, para ter mais tempo para ver erros de digitação.Isso não resolve tudo. Apenas um truque simples do dia a dia.
fonte