Por que a recursão não sobe com a rm?


13

Eu estou querendo saber sobre a direção da recursão em geral e rm especificamente.

recursão rm só funciona para baixo correto?

Em execução: sudo rm -R *.QTFSexcluirá todos os arquivos * .QTFS no diretório atual e seus filhos, correto?

O diretório atual, como exibido por, ls -lhatambém contém .e ..links para a falta de uma palavra melhor; então, por que a recursão não os segue na árvore de diretórios? Existe um limite artificial no aplicativo rm, ou .e ..não são coisas reais?


5
Por causa raiz, e loucura, de que maneira mentiras ...
jasonwryan


1
Bem, para uma anedota interessante ... Corri rm -rf em alguns subdiretórios de aparência inocente em um ponto, apenas para descobrir, para meu horror, que um usuário havia vinculado coisas lá dentro a um montante muito importante, que a rm começou a comer. Sim, eu tinha backups atuais e nenhum dado foi perdido, mas deixá-lo ser um conto preventivo ... :-)
Brian Knoblauch

@BrianKnoblauch, que mal poderia ser causado pela remoção de um link físico? Eu não chegar ao ponto de você história ...
Alexey

@ Alexey O ponto é que o próprio link físico não foi removido. Ele recursed para dentro do diretório ligada duro, que estava ligado a um ponto mais alto no sistema de arquivos, então começou a comer os dados de todos ...
Brian Knoblauch

Respostas:


18

rm recursão só funciona para baixo correto?

rm -r x yirá excluir xe ytudo dentro deles (se forem diretórios), mas não seus pais ou qualquer coisa fora deles.

Em execução: sudo rm -R *.QTFSexcluirá todos os arquivos * .QTFS no diretório atual e seus filhos, correto?

Não. Ele excluirá todos os arquivos nomeados *.QTFS, todos os arquivos recursivamente dentro dos diretórios chamados *.QTFSe os próprios diretórios. Se você quiser esse outro comportamento de exclusão, use find -delete.

O diretório atual, como exibido por, ls -lhatambém contém .e ..links para a falta de uma palavra melhor; então, por que a recursão não os segue na árvore de diretórios? Existe um limite artificial no aplicativo rm, ou .e ..não são coisas reais?

É um limite artificial de rm.

No entanto, não é tão artificial - é a única maneira de funcionar. Se rmseguissem os ..links principais , todos rm -rremoveriam todos os arquivos do sistema, seguindo todos os ..links até o final /. rmvê as entradas ..e .em cada diretório quando lista o conteúdo e as ignora explicitamente por esse motivo.

Você pode tentar isso sozinho, de fato. Execute rm -r .e a maioria das rmimplementações se recusará a agir, relatando um erro explicitamente:

$ rm -r .
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’

(essa mensagem é do GNUrm ; outros são semelhantes). Quando encontra essas entradas implicitamente, e não como argumentos explícitos, apenas as ignora e continua. Esse comportamento é exigido pelo POSIX . No GNU rme em muitos dos BSDs, é fornecido automaticamente pela fts_readfamília de funções de passagem pela hierarquia.

ou .e ..não são coisas reais?

.e geralmente.. são entradas de diretório reais, embora isso seja específico do sistema de arquivos. Eles quase sempre serão apresentados como se fossem entradas reais para todo o código do usuário, independentemente. Muitos programas (e não apenas ) casos especiais de comportamento para capturar ou impedir recursões descontroladas ou indesejáveis.rm


Para quem procura provas (ou simplesmente interessado), dê uma olhada em como isso é implementado nos coreutils do GNU .
Chris Hayes

@ChrisHayes O link equivalente do gitweb está na resposta. O caso recursivo real está na fts_readimplementação, porém, aquele é apenas para argumentos de linha de comando.
Michael Homer

@MichaelHomer Oh uau, assim é. Essa cor do link não se destaca nesse esquema SE. Meu erro.
Chris Hayes

2
Esta resposta está correta, mas também um pouco imprecisa. rmnem vê *.QTFSporque é expandido globalmente nos nomes de arquivos pelo bash antes que o binário rm seja invocado. A resposta de @ tobyink observa isso.
Daenyth

Como nota, aqueles .e ..comportamento do caso especial são referidos como sendo a causa da existência dotfiles
mgarciaisaia

5

Além do que Michael Homer escreveu, há outro fator que dificulta a inclusão acidental no diretório pai.

Entre no seu diretório pessoal e digite algo como:

echo *s*

Você verá que ele mostra uma lista de arquivos e diretórios contendo a letra "s". No entanto, nenhum arquivo começando com um ponto inicial é mostrado. Para mostrá-los, você pode usar:

echo .*s*

Isso ocorre porque o shell se recusa a expandir *para abranger um ponto inicial. Isso significa que:

rm -fr *

Não recuará ...

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.