2008-09-16 10 views
4

Je souhaite supprimer tous les répertoires sauf les 4 plus récents dans mon répertoire parent. Comment feriez-vous cela dans Bash?Supprimer tout sauf les 4 nouveaux répertoires

+0

Vous ne pouvez pas récupérer l'heure de création de fichiers ou de répertoires car elle n'est pas stockée où que ce soit. Le plus proche que vous pouvez obtenir est le temps de changement d'inode: http://www.faqs.org/faqs/unix-faq/faq/part3/section-1.html et l'ajout ou la suppression de fichiers dans les répertoires modifie l'inode. –

+0

... si l'ajout ou la suppression de fichiers d'un répertoire enfant ne modifie pas * un * inode parent. –

Répondre

9
ls -atrd */ | head --lines=-4 | xargs rm -rf 

Edit: ajouté « a » argument ls

+0

cela laissera 4 derniers répertoires modifiés au lieu des 4 derniers créés, ne remarquera pas les répertoires commençant par un point, la tête cassera pour les noms contenant des lignes, xargs se cassera pour les noms contenant des espaces, et rm affichera un message d'erreur s'il n'y a rien à supprimer. –

+0

Bons points. J'ai maintenant ajouté 'a' à ls pour capturer les répertoires avec un point, et grepped pour se débarrasser des répertoires actuels et parents, mais vous avez raison. C'est une réponse simple avec quelques limitations importantes comme vous l'avez souligné. –

+0

Correction: aucun grep n'est nécessaire pour filtrer le répertoire courant et parent car ils ne sont pas affichés par ls * / –

1

S'il vous plaît préciser si vous voulez dire « supprimer tous les répertoires, mais les quatre les newst » ou « supprimer tout (fichiers et répertoires), sauf pour les quatre nouveaux répertoires ".

Veuillez également noter que les heures de création ne sont pas connues pour les répertoires. On ne peut dire quand un répertoire a été modifié pour la dernière fois, c'est-à-dire si des fichiers ont été ajoutés, supprimés ou renommés.

1

vous pouvez effectuer les opérations suivantes:

#!/bin/bash 

#store the listing of current directory in var 
mydir=`ls -t` 
it=1 

for file in $mydir 
    do 
     if [ $it -gt 5 ] 
     then 
      echo file $it will be deleted: $file 
      #rm -rf $file 
     fi 
     it=$((it+1)) 
    done 

(retirer le # avant rm pour y arriver vraiment;))

0

Une autre, BSD-sûr, façon de le faire, avec des tableaux (pourquoi non?)

#!/bin/bash 
ARRAY=(`ls -td */`) 
ELEMENTS=${#ARRAY[@]} 
COUNTER=4 
while [ $COUNTER -lt $ELEMENTS ]; do 
    echo ${ARRAY[${COUNTER}]} 
    let COUNTER=COUNTER+1 
done 
Questions connexes