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
csny
la source

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/.

John WH Smith
la source
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
serenesat
la source
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