2009-11-03 4 views
4

J'ai deux dossiers, par souci d'arguments/Volumes/A et/Volumes/B. Ils sont montés sur des partages réseau à partir d'un serveur Windows contenant un chargement de fichiers .bkf à partir de Backup Exec.Bash Script pour trouver le fichier le plus récemment modifié

Je suis à la recherche d'un script qui va regarder dans les deux dossiers et trouver le fichier .bkf modifié le plus récemment et le copier vers un autre emplacement. Il y a d'autres fichiers dans les dossiers qui doivent être ignorés.

Merci d'avance !!

Shaun

Edit:

Je frappai cela ensemble:

cp ls -alt /Volumes/E /Volumes/F| grep bkf | head -n 1 | awk '{print $8}' /Volumes/$xservedisk/Windows/ 

Quelqu'un peut-il penser à des raisons pour lesquelles je ne devrais pas l'utiliser?

Merci encore Shaun

Répondre

3
NEWEST= 
for f in /Volumes/A/*.bkf /Volumes/B/*.bkf 
do 
    if [ -z "$NEWEST" ] 
    then 
     NEWEST=$f 
    elif [ "$f" -nt "$NEWEST" ] 
    then 
     NEWEST=$f 
    fi 
done 
+0

ou réduire le corps à '[-n « $ RÉCENTS "] && [" $ NEWEST "-nt" $ f "] || NEWEST = $ f', mais je suppose que c'est un goût personnel. – ephemient

+0

C'était la solution qui fonctionnait le mieux car j'avais besoin du chemin complet du fichier. Merci Douglas! –

2

Recherche de fichiers se fait avec: find /Volumes/[AB] -name '*.bkf'

Tri des fichiers par date de modification se fait avec: ls -t

si charge des fichiers est pas tant que ça , vous pouvez simplement utiliser:

ls -lrt `find /Volumes/[AB] -name '*.bkf'` 

Le dernier fichier affiché est le dernier modifié.

modifier

Une solution plus robuste (ephemient thanks) est:

find /Volumes/[AB] -type f -name '*.bkf' -print0 | xargs -0 ls -lrt 
+2

Echoue sur tous les noms contenant des espaces ou d'autres caractères impairs. – ephemient

+0

C'est pourquoi j'ai upvoted votre réponse. Le mien peut être suffisant pour la plupart des utilisateurs de la vieille école. – mouviciel

+0

Eh bien, vous pouvez contourner le problème en 'find -print0 | xargs -0 ls -ldrt' ('-d' dans le cas où un idiot a créé un répertoire nommé' * .bkf'), mais cela laisse toujours le problème de l'analyse syntaxique ... – ephemient

2

passe par quelques tours juste pour vous assurer de gérer les noms de fichiers avec des caractères bizarres et qui ne de mouviciel pas:

NEWEST=$(find /Volumes/A /Volumes/B -name '*.bkf' -printf '%[email protected] %p\0' | \ 
    sort -rnz | xargs -0n1 2>/dev/null | head -n1 | cut -d' ' -f2-) 
[[ -n "$NEWEST" ]] && cp -v "$NEWEST" /other-location 

En fait, étant donné que ces fichiers proviennent de Windows et sont donc à peu près garantie de ne pas avoir ombles impair tères dans leurs noms (comme), caractère de nouvelle ligne

NEWEST=$(find /Volumes/A /Volumes/B -name '*.bkf' -printf '%[email protected] %p\n' | \ 
    sort -rn | head -n1 | cut -d' ' -f2-) 
[[ -n "$NEWEST" ]] && cp -v "$NEWEST" /other-location 
+0

Pourquoi choisissez-vous d'utiliser une terminaison nulle? – Xailor

+0

Les noms de fichiers contenant des retours à la ligne imbriqués feraient trébucher le 'sort' autrement. Bien sûr, si le fichier principal trouvé se retrouvait avec une nouvelle ligne intégrée, 'head' ne ferait pas non plus la bonne chose non plus. – ephemient

+0

Merci pour les bonnes réponses, après avoir ouvert cette question, j'ai créé ceci, y at-il quelque chose de mal à le faire de cette façon: cp 'ls -alt/Volumes/E/Volumes/F | grep bkf | tête -n 1 | awk '{print $ 8}' '/ Volumes/$ xservedisk/Windows/ Merci encore –

1
cp `find /Volumes/[AB] -name '*bkf' -type f -printf "%[email protected]\t%p\n" |sort -nr |head -1 |cut -f2` dst_directory/ 
+1

Bon, mais vous devriez trier le temps de modification au lieu de l'heure d'accès, et cela échoue si les noms de chemins contiennent des espaces (vous avez presque le droit, cependant), et 'cp' ne fonctionne pas avec un seul argument. – ephemient

+0

Ah, je vois que vous avez déjà fixé le dernier bit. – ephemient

+0

Dans un montage NFS, l'accès peut sûrement être limité, mais sûrement d'autres fois devraient être considérés. Oui, cp était mon erreur de frappe, édité. Les noms de fichiers peuvent avoir des espaces? j/k Les guillemets doivent corriger cela. – Xailor

5

Je préfère cela pour trouver le fichier le plus récemment modifié:

find . -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort 
+0

Cela a l'inconvénient d'être récursif. – Plasma

Questions connexes