Supprimer des fichiers antérieurs à un fichier spécifique


14

Je dois supprimer d'un dossier tous les fichiers antérieurs à un fichier spécifique.
Exécution de bash sur CentOS 7.

J'ai une solution pour cela, mais je pense qu'il devrait y avoir une manière plus élégante de le faire:

reference_file=/my/reference/file

get_modify_time()
{
    stat $1 | grep -Po "Modify: \K[0-9- :]*"
}

pit=$(get_modify_time $reference_file)
for f in /folder/0000* ; do [[ "$pit" > "$(get_modify_time $f)" ]] && rm $f ; done

Réponses:


28

Je ne l'ai pas essayé, mais je finddevrais être capable de gérer l'ensemble de l'opération très bien:

$ find dir/ -type f ! -newer reference -delete

... ou...

$ find dir/ -type f ! -newer reference ! -name reference -delete

Fondamentalement:

  • ! -newer referencecorrespond aux fichiers qui ont été modifiés moins récemment que reference.
  • -delete les supprime.
  • ! -name referenceexclut reference, au cas où il se trouve également sous dir/et que vous souhaitez le conserver.

Cela devrait supprimer tous les fichiers antérieurs referenceet situés sous dir/.


2
Parfait :). Juste ajouté -maxdepth 1pour garder la recherche non récursive
csny

3
! -newersignifie «pas plus récent», donc «plus âgé ou du même âge »; le fichier lui-même sera mis en correspondance s'il se trouve dans le chemin d'accès find, juste quelque chose à garder à l'esprit.
ferada

1
@ferada Ce ne sera pas le cas si vous l'excluez, c'est pourquoi ma réponse comprend également ! -name reference(voir la troisième puce).
John WH Smith

7

comparer les temps de modification des fichiers avec test, en utilisant -ntles -otopérateurs (plus récents que) et (plus anciens que):

if [ "$file1" -ot "$file2" ]; then
    #do whatever you want;
fi

2
Merci, c'est mieux que ma solution, mais vous devez toujours parcourir tous les fichiers du dossier et comparer ... L'autre réponse est encore plus élégante
csny
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.