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
ls
imprime des chemins relatifs, utilisez laxargs printf
chose pour ajouter le chemin du dossier et en faire un chemin absolu;Envoyez-les à l'
sudo rm -rf
aidexargs
.
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 -rf
est 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 sudo
parce 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
ls
sortie, c'est déjà une commande mal écrite, même avec des guillemets. ls
utilise également les paramètres régionaux pour l'ordre de tri, je pense, donc je ne vois pas à quoi sert la head
suppression des 2 derniers (sauf si vous essayez de vous débarrasser .
et ..
quels iirc ne sont pas autorisés comme arguments de rm
toute façon. Utilisez simplement find /path/to/folder -type f delete
. Et non sudo
si 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
?