rm
pedirá confirmação para destinos não graváveis se stdin for um terminal. O sinal -i
, por outro lado, ativa a confirmação de todos os destinos . Claramente nem funciona com a solução simples de canalizar yes n
para rm
, então devemos usar outra coisa.
Usando o GNU find, exclua todos os objetos que tenham pelo menos um dos bits do modo de gravação definidos (como de costume, use -print
em vez de -delete
no primeiro teste):
find dir/ -perm /0222 -delete
Ou, exclua todos os arquivos (*) com pelo menos um conjunto de bits no modo de gravação, mas pule o conteúdo de diretórios não graváveis:
find . -type d ! -perm /0222 -prune -o ! -type d -perm /0222 -exec rm {} +
(* na verdade tudo exceto diretórios)
-delete
implica em uma busca em profundidade (pelo menos no GNU find), e não funciona com -prune
, então não podemos usar isso aqui. Podemos excluir diretórios graváveis vazios depois disso:
find . -type d -perm /0222 -delete
Isso lançará erros para diretórios não vazios.
-perm /0222
significa "qualquer um dos bits de gravação está definido" e seu inverso ! -perm /0222
para "nenhum dos bits de gravação está definido".
Em outras versões do find, use +0222
em vez de /0222
. (De acordo com a manpage do GNU, o primeiro entra em conflito com os requisitos do POSIX e foi descontinuado.)
Para encontrar os arquivos e diretórios não-graváveis, podemos usar da mesma forma
find . ! -perm /0222
Listar recursivamente o conteúdo de diretórios não-graváveis é um pouco mais difícil de fazer, mas com ferramentas GNU isso pode funcionar:
find . ! -perm /0222 -print0 | xargs -0 find