Très bien, il y a quelques problèmes avec votre script.
Tout d'abord, et le plus problématique, est cette ligne:
ls -t /var/path/to/folder |head -n 3;
ls -t
retourne une liste des fichiers afin de leur date de dernière modification, en commençant par le plus récemment modifié. head -n 3
dit de ne lister que les trois premières lignes. Donc, ce que cela signifie est "donnez-moi une liste de seulement les trois fichiers les plus récemment modifiés", ce que je ne pense pas que vous voulez.
Je ne suis pas vraiment sûr de ce que vous faites avec la deuxième commande ls
, mais je suis sûr que cela va concaténer tous les fichiers du répertoire dans votre liste. Cela signifie que quand il est sort
ed et uniq
'ed, il vous reste juste une liste alphabétique de tous les fichiers dans ce répertoire. Quand ceci sera passé à quelque chose comme xargs rm
, vous effacerez tout dans ce répertoire.
Ensuite, sort | uniq
n'a pas besoin de la pièce uniq
. Vous pouvez simplement utiliser le -u
sur sort
pour se débarrasser des doublons. Vous n'avez pas besoin de cette partie de toute façon.
Enfin, la suppression effective du répertoire. Sur cette partie, vous aviez raison dans votre question: il suffit d'utiliser rm -r
Voici la meilleure façon que je peux penser à faire:
ls -t1 /var/path/to/folder | tail -n +4 | xargs rm -r
Voici ce qui se passe ici:
ls -t1
est l'impression d'une liste, un fichier/répertoire par ligne, de tous les fichiers en /var/path/to/folder
, en classant par date de modification la plus récente.
tail -n +4
imprime toutes les lignes dans la sortie de ls -t1
en commençant par la quatrième ligne (c.-à-d.les trois derniers fichiers modifiés ne seront pas listés)
xargs rm -r
indique de supprimer toute sortie de fichier du tail
. Le -r
signifie supprimer des fichiers récursivement, donc s'il rencontre un répertoire, il supprimera tout dans ce répertoire, puis supprimera le répertoire lui-même.
Notez que je ne trie rien ou ne supprime aucun doublon. C'est parce que:
ls
ne rapporte qu'un fichier une fois, donc il n'y a pas de doublons pour enlever
- vous supprimez tous les fichiers transmis de toute façon, il n'a pas d'importance dans quel ordre ils sont supprimés.
Est-ce que tout cela a du sens?
Edit:
Depuis que je me suis trompé sur ls
spécifiant le chemin complet lorsqu'il est passé un répertoire absolu, et puisque vous pourriez ne pas être en mesure d'effectuer un cd
, vous pourriez peut-être utiliser tail
à la place.
Par exemple:
ls -t1 /var/path/to/folder | tail -n +4 | xargs find /var/path/to/folder -name $1 | xargs rm -r
Salut merci pour la réponse, mais j'obtenir le fichier noms seulement, un de mes principaux besoins est d'exécuter ce code à partir de n'importe quel dir du serveur et de supprimer les fichiers dans ce dossier var/path/to cela fonctionne bien si je suis dans le même dossier var/path/to/dossier – nivanka
@nivanka: C'est vraiment bizarre. Spécifiez-vous un chemin relatif ou absolu? Vous devez spécifier un chemin absolu si vous voulez l'exécuter depuis n'importe quel répertoire du serveur. Pouvez-vous copier/coller la commande * exact * que vous utilisez? – AgentConundrum
salut, c'est ce que je fais ls -t1/var/chemin/vers/dossier | queue -n +4 | xargs rm -r – nivanka