2009-01-12 5 views
3

J'ai remarqué aujourd'hui (après ~ 8 ans de piratage heureux à bash) qu'il n'y a pas de manière triviale de «supprimer par date» en utilisant «rm». La solution est donc de canaliser les choses autour d'une combinaison de commandes comme rm, ls, find, awk et sed.Existe-t-il un moyen trivial de «supprimer par date» en utilisant «rm» dans bash?

Dire par exemple que je voulais supprimer tous les fichiers dans le répertoire de travail à partir de 2009, quelle serait l'approche typique?

je suis venu avec ce qui suit, qui est bout à bout laid et ne doit être exécuté si « rm » est réglé pour sauter les répertoires (sinon vous allez supprimer le répertoire parent):

ls -la | awk '{if (substr($6,0,5)==2009) print $8}' | xargs rm 

Points pour les solutions les plus élégantes et les plus extravagantes.

+0

Qu'est ce que "l", au début du tuyau? Un alias pour "ls -l"? – unwind

+0

oups, oui alias 'ls -la' – Fergie

Répondre

8

Certaines versions de trouver en charge l'option -delete, ce qui rend encore plus efficace ...

find . -maxdepth 1 -type f -ctime -12 -delete; 

Vérifiez votre homme trouver la page (ce qui a travaillé sur la plupart Ces dernières versions d'Ubuntu pour moi)

+0

nice- J'aime qu'il n'y a pas de tuyaux ou -execs – Fergie

+0

Nice, sauf qu'il n'utilise pas RM comme requis dans la question. Je ne suis pas à la traîne: l'utilisation de rm est une exigence valide si, par exemple, vous voulez utiliser -i pour la suppression interactive ... – Alastair

+0

Où "ctime" indique que le fichier 'Changed timestamp' (en jours/périodes 24hr) était mis à jour: ON/EXACTEMENT: aucun signe sur le numéro AVANT/ANCIEN: signe négatif APRÈS/PLUS TARD: positif + signe. Ainsi, l'exemple ci-dessus supprime les fichiers qui ont été modifiés il y a plus de 12 jours. – MikeW

10

Je combinerait trouver et rm (sans tuyau)

find . ...bunch of find criterias to select certain files (e.g. by date) .... -exec rm \{\} \; 

EDIT: avec les paramètres de votre exemple, il serait

find . -maxdepth 1 -type f -ctime -12 -exec rm \{\} \; 

OPPOSITION: Cela fonctionne aujourd'hui :-). (Pour le faire fonctionner à chaque fois, remplacez-time par absoulte, voir timeXY dans la page de manuel)

+0

Exemple ici: http: //www.howtogeek.com/howto/ubuntu/delete-files-anciens-que-x-days-on-linux/ – OIS

+0

Y at-il un risque de "rm" interpréter un nom de fichier comme un commutateur de commande dans ce scénario, et donc de supprimer trop peu ou trop beaucoup? –

+0

@Rob: Partiellement: "-exec" appelle rm avec un seul argument à la fois, il n'y a donc que le danger d'effacer trop peu. Vous pouvez remplacer "rm \ {\} \;" avec "rm - \ {\} \;" pour éviter cela. –

1

find(1) est un beaucoup plus efficace pour faire ce que vous voulez que l'analyse ls(1) de sortie.

EDIT: quelque chose à surveiller est avec des espaces dans les noms de fichiers eux afin que vous voulez avoir un find qui soutient -print0 (à utiliser avec xargs -0) pour une meilleure performance.

find . -mtime +12 -print0 | xargs -0 rm -f 
1

au lieu de ls d'analyse syntaxique (1) qui peut briser trop facilement vous devez compter sur stat (1):

stat -c '%z/%n' files_or_glob | grep '^date' | cut -d/ -f2- | xargs -d '\n' rm -i 

par exemple

$ stat -c '%z/%n' *| grep '^2008-12-16' | cut -d/ -f2- | xargs -d '\n' rm -i 

Remarque: cela ne gérera pas correctement les noms de fichiers avec des retours à la ligne imbriqués. Cependant, ils sont rarement trouvés dans le wil.d

3

J'utiliseraient:

find . -maxdepth 1 -type f -newerct 'jan 1' -print0 \ 
    | xargs -0 rm 

(ou -newermt si vous souhaitez filtrer sur le temps de modification)

Notez que la forme 't' de -newerXY autorisera prétendument n'importe quel format de date compatible avec cvs (voir doco).

Questions connexes