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