J'ai écrit un script qui supprime tout sauf les deux derniers fichiers d'un dossier:
#!/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
Ce script sera exécuté quotidiennement en tant que tâche cron.
Le raisonnement est le suivant:
Obtenir une liste de tous les fichiers en utilisant
ls -1(pour que j'obtienne un fichier par ligne);Supprimez les deux derniers de la liste en utilisant
head -n -2;Depuis
lsimprime des chemins relatifs, utilisez laxargs printfchose pour ajouter le chemin du dossier et en faire un chemin absolu;Envoyez-les à l'
sudo rm -rfaidexargs.
Tout le monde a accès à ce dossier, donc tout le monde peut créer et supprimer tous les fichiers de ce dossier.
Le problème est: sudo rm -rf est effrayant. xargs sudo rm -rfest incroyablement effrayant.
Je veux être sûr que personne ne peut endommager d'autres dossiers / systèmes en créant des fichiers intelligents à supprimer (accidentellement ou volontairement). Je ne sais pas, quelque chose d'intelligent comme:
file with / spaces.txt
ce qui pourrait entraîner un super effrayant sudo rm -rf /.
EDIT: Mon erreur, les noms de fichiers ne peuvent pas contenir /, donc ce problème spécifique ne se produirait pas, mais la question de savoir s'il existe ou non d'autres risques persiste.
C'est pourquoi j'utilise --quoting-style=shell-always, cela devrait empêcher toute astuce avec des fichiers avec des espaces. Mais maintenant, je me demande si quelqu'un pourrait être très intelligent avec des espaces et des guillemets dans le nom de fichier, peut-être.
Mon script est-il sûr?
Remarque: j'ai besoin sudoparce que j'accède au dossier à distance (à partir d'un lecteur réseau mappé à l'aide mount), et je ne pouvais pas le faire fonctionner sans sudo.
/on créer un fichier avec le personnage dans le nom J'essaie de réaliser ceci ici
lssortie, c'est déjà une commande mal écrite, même avec des guillemets. lsutilise également les paramètres régionaux pour l'ordre de tri, je pense, donc je ne vois pas à quoi sert la headsuppression des 2 derniers (sauf si vous essayez de vous débarrasser .et ..quels iirc ne sont pas autorisés comme arguments de rmtoute façon. Utilisez simplement find /path/to/folder -type f delete. Et non sudosi vous exécutez depuis cron - cron est déjà au niveau racine
printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm?