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 *.QTFS
excluirá todos os arquivos * .QTFS no diretório atual e seus filhos, correto?
O diretório atual, como exibido por, ls -lha
també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?
Respostas:
rm -r x y
irá excluirx
ey
tudo dentro deles (se forem diretórios), mas não seus pais ou qualquer coisa fora deles.Não. Ele excluirá todos os arquivos nomeados
*.QTFS
, todos os arquivos recursivamente dentro dos diretórios chamados*.QTFS
e os próprios diretórios. Se você quiser esse outro comportamento de exclusão, usefind -delete
.É um limite artificial de
rm
.No entanto, não é tão artificial - é a única maneira de funcionar. Se
rm
seguissem os..
links principais , todosrm -r
removeriam todos os arquivos do sistema, seguindo todos os..
links até o final/
.rm
vê 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 dasrm
implementações se recusará a agir, relatando um erro explicitamente:(essa mensagem é do GNU
rm
; 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 GNUrm
e em muitos dos BSDs, é fornecido automaticamente pelafts_read
família de funções de passagem pela hierarquia..
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
fonte
fts_read
implementação, porém, aquele é apenas para argumentos de linha de comando.rm
nem vê*.QTFS
porque é expandido globalmente nos nomes de arquivos pelo bash antes que o binário rm seja invocado. A resposta de @ tobyink observa isso..
e..
comportamento do caso especial são referidos como sendo a causa da existência dotfilesAlé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:
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:
Isso ocorre porque o shell se recusa a expandir
*
para abranger um ponto inicial. Isso significa que:Não recuará
..
.fonte