Eu escrevi um script que exclui todos, exceto os dois últimos arquivos em uma pasta:
#!/bin/bash
ls -1 --quoting-style=shell-always /path/to/some/folder \
| head -n -2 \
| xargs printf -- "'/path/to/some/folder/%s'\n" \
| xargs sudo rm -rf
Este script será executado como um trabalho cron todos os dias.
O raciocínio é o seguinte:
Obtenha uma lista de todos os arquivos usando
ls -1
(para que eu obtenha um arquivo por linha);Remova os dois últimos da lista usando
head -n -2
;Como
ls
imprime caminhos relativos, use oxargs printf
objeto para preceder o caminho da pasta e torná-lo um caminho absoluto;Envie-os para
sudo rm -rf
usarxargs
.
Todos têm acesso a esta pasta, para que qualquer pessoa possa criar e excluir qualquer arquivo nessa pasta.
O problema é: sudo rm -rf
é assustador. xargs sudo rm -rf
é incrivelmente assustador.
Quero ter certeza de que ninguém pode danificar outras pastas / sistemas criando arquivos inteligentes a serem excluídos (acidentalmente ou de propósito). Não sei, algo inteligente como:
file with / spaces.txt
o que poderia resultar em um super assustador sudo rm -rf /
.
EDIT: Meu erro, os nomes dos arquivos não podem conter /
, portanto esse problema específico não aconteceria, mas a questão sobre se há ou não outros riscos ainda permanece.
É por isso que estou usando --quoting-style=shell-always
, isso deve evitar truques com arquivos com espaços. Mas agora estou me perguntando se alguém poderia ser mais inteligente com espaços e aspas no nome do arquivo, talvez.
Meu script é seguro?
Nota: preciso sudo
porque estou acessando a pasta remotamente (de uma unidade de rede mapeada usando mount
) e não consegui fazê-la funcionar sem o sudo.
/
em nome ser criado Estou tentando conseguir isso de volta aqui
ls
saída, este já é um comando mal escrito, mesmo com a citação. ls
também usa locale para ordem de classificação, eu acho, então não vejo qual é o objetivo de head
remover os últimos 2 (a menos que você esteja tentando se livrar .
e do ..
qual o iirc não seja permitido como argumento de rm
qualquer maneira. Basta usar find /path/to/folder -type f delete
. não sudo
se você executar a partir do cron - cron já está no nível raiz
printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm
?