Obtenir le file le plus récent de la structure de directory année / mois / date / heure

Je stocke des sauvegardes de bases de données dans une structure de directorys

year/month/day/time/backup_name

un exemple serait

basics_mini / 2012/11/05/012232 / RATIONAL.0.db2inst1.NODE0000.20110505004037.001 basics_mini / 2012/11/06/012251 / RATIONAL.0.db2inst1.NODE0000.20110505003930.001

notez que l'horodatage du file de sauvegarde ne peut pas être utilisé. Avant le début des tests d'automation, l'heure du server est réglée sur 5.5.2011

Donc, la question est comment je peux get le dernier file si je passe le "directory de base" ( basics_mini ) à une fonction que je vais coder.

J'ai besoin de restaurer la plus nouvelle database. Je le fais en php mais je me request s'il existe une solution de script shell simple.

 find 'basics_mini' -type f | sed 's/.*basics_mini\///' | sort -t '/' -k1nr -k2nr -k3nr -k4nr | head -1 

Cela finda des files dans votre directory de sauvegarde, puis sed supprimera le path d'access principal (jusqu'à votre year directory). Ensuite, le sorting séparera le path sur '/' et effectuera un sorting numérique sur les champs 1, 2, 3 et 4, c'est-à-dire l'année, le mois, le jour et l'heure. Enfin, la head -1 returnnera la première ligne de sortie.

Bien sûr, cela ne renverra qu'un seul file même s'il y a plusieurs inputs identiques les plus récentes (si cela vous préoccupe).

find devrait répondre à vos besoins:

 find "/path/to/backup_dir" -type f|sort -r|head -n1 

Cela ne fonctionne que si vous avez (comme dans votre exemple) des zéros sur vos dossiers de mois et de jour

Si vous souhaitez une sauvegarde avec un nom de file spécifique (ou un model), ajoutez un model de nom aux parameters de search, par exemple

 find "/path/to/backup_dir" -type f -name "*db2inst1*"|sort -r|head -n1 

… ou utilisez -iname pour les motifs insensibles à la casse

Maintenant aux détails des commands ci-dessus:

  • find "/path" énumère récursivement tous les files / dirs dans le path donné (sauf si vous utilisez un filtrage supplémentaire:
  • le paramètre -type f de find filter tout ce qui n'est pas un file normal)
  • -name ou -iname files selon un model spécifique
  • sort sortinge la sortie dans l'ordre inverse ( -r )
  • head -n1 imprime uniquement la première ligne ( -n 1 ) de son input et la quitte immédiatement après cela.

Avec ce schéma de nommage, la sauvegarde la plus récente se trouve dans le dernier sous-directory dans l'ordre lexicographique. Vous pouvez get le directory le plus récent directement dans le shell, en tirant parti du fait que les caractères generics sont développés dans l'ordre lexicographique.

 cd basics_mini set [0-9][0-9][0-9][0-9]/*/*/* shift $(($#-1)) echo "The most recent backup is in $1" 

Dans zsh, vous pouvez directement get le dernier directory avec un qualificateur glob.

 echo "The most recent backup is in" basics_mini/[0-9][0-9][0-9][0-9]/*/*/*([-1]) 

Ma solution serait d'utiliser cela. Il affichera le file le plus récent possible:

 ls -lcR --full-time | grep '^-' | sort -k 6 -r | head -n 1 

Explication:

 ls -lcR 

-l utilise un format de list longue

-c affiche ctime (heure de la dernière modification des informations d'état du file)

-R sous-directorys de list récursivement

grep pour les files commençant par un - (tiret), signifiant 'files-réguliers'.

 sort -k 6 -r 

-k Trier par la colonne n (6 car cela contient le champ de date)

-r Inversé

 head -n1 

-n nombre de lignes à afficher (de haut en bas 1)

 find -maxdepth 1 -type ['d' for directory or 'f'for file] | ls -t | head -1 .. 

Cela devrait fonctionner.