2010-12-15 92 views
8

J'ai un dossier qui contient des vérifications de révision de subversion (celles-ci sont extraites lors de l'exécution d'une recette de déploiement capistrano). Ce que je veux vraiment faire est de garder les 3 dernières révisions que le script capistrano extrait et d'en supprimer d'autres, donc pour cela je prévois d'exécuter une commande sur le terminal en utilisant une commande d'exécution, en fait capistrano hasn ' Je n'ai rien à faire ici, mais une commande unix.comment supprimer tous les fichiers sauf les trois derniers dans un dossier

J'essayais d'exécuter une commande pour obtenir une liste de fichiers à l'exception des trois derniers et supprimer le reste, je pourrais obtenir la liste des fichiers en utilisant la commande suivante.

(ls -t /var/path/to/folder |head -n 3; ls /var/path/to/folder)|sort|uniq -u|xargs 

maintenant si j'ajouter un rm -rf à la fin de cette commande, il me retourne avec le fichier non trouvé supprimer. donc c'est évident parce que cela renvoie seulement le nom du dossier, pas le chemin d'accès complet au dossier.

est-il de toute façon de supprimer ces fichiers/dossiers en utilisant une commande unix?

Répondre

13

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 
+0

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

+0

@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

+0

salut, c'est ce que je fais ls -t1/var/chemin/vers/dossier | queue -n +4 | xargs rm -r – nivanka

0

Salut, je trouve une façon de le faire, nous pouvons utiliser le unix & &

donc la commande ressemblera à ceci

cd /var/path/to/folder && ls -t1 /var/path/to/folder | tail -n +4 | xargs rm -r 
1

est Ci-dessous un moyen utile de faire la tâche ....... !!

pour Linux et HP-UX:

ls -T1 | queue -n +50 | xargs rm -r # pour laisser les 50 derniers fichiers/répertoires.

pour SunOS:

rm `(ls -t | head -n 100; ls) | sort | uniq -u`