2010-10-21 7 views
1

J'utilise bash. Supposons que je possède un répertoire de fichiers journaux /var/myprogram/logs/Copiez les trois fichiers les plus récents dans un répertoire (récursivement) vers un autre répertoire spécifié

Sous ce répertoire, j'ai de nombreux sous-répertoires et sous-sous-répertoires qui incluent différents types de fichiers journaux de mon programme. Je voudrais trouver les trois derniers fichiers (modifiés plus récemment), dont le nom commence par 2010, sous /var/myprogram/logs/, indépendamment du sous-répertoire et copiez-les dans mon répertoire personnel.

Voici ce que je ferais manuellement
1. Allez dans chaque répertoire et faire ls -lt 2010* pour voir quels fichiers commençant par 2010 sont modifiés le plus récemment.
2. Une fois que je passerai par tous les répertoires, je saurais quels sont les trois plus récents. Je les copie donc manuellement dans mon répertoire personnel.

C'est assez fastidieux, alors je me demandais si je pouvais peut-être canaliser certaines commandes ensemble pour faire cela en une seule étape, de préférence sans utiliser de scripts shell?

J'ai cherché dans find, ls, head et awk que je pourrais être en mesure d'utiliser, mais ne l'ai pas compris la bonne façon de les coller ensemble. Faites-moi savoir si je dois clarifier. Merci.

Répondre

1

Voilà comment vous pouvez le faire:

find -type f -name '2010*' -printf "%[email protected]\t%P\n" |sort -r -k1,1 |head -3 |cut -f 2- 

cette commande affiche une liste des fichiers préfixés par le dernier temps de changement, les trie en fonction de cette valeur, prend le top 3 et supprime l'horodatage.

+0

Je aime vraiment cette solution. Vous n'avez même pas utilisé une boucle FOR. Merci. – Russell

0

Ma réponse "la plus courte" après le piratage rapide.

for file in $(find . -iname *.php -mtime 1 | xargs ls -l | awk '{ print $6" "$7" "$8" "$9 }' | sort | sed -n '1,3p' | awk '{ print $4 }'); do cp $file ../; done 

La commande principale stockée dans $() effectue les opérations suivantes:

  1. Find tous les fichiers récursive dans répertoire correspondant courant (insensible à la casse) le nom * .php et ayant été modifiés dans les dernières 24 heures .

  2. tuyau à ls -l, nécessaire pour être en mesure de trier par date de modification, afin que nous puissions avoir les trois premiers

  3. Extrait la date de modification et le nom du fichier/chemin avec awk

  4. Sort ces fichiers sur la base datetime

  5. Avec sed imprimer seulement les 3 premiers fichiers

  6. Avec awk imprime uniquement leur nom/chemin d'accès

  7. Utilisé dans une boucle for et de les copier à l'emplacement souhaité.

Ou utilisez @ la variante de Hasturkun, qui surgit comme une réponse alors que je faisais le montage ce post :)

1

Vos réponses se sentent très compliqué, que diriez-vous

pour le fichier dans find . -type d; faire ls -t -1 -F $ FICHIER | grep -v "/" | tête -n3 | xargs -I {} mv {} ..; terminé;

ou bien aménagé

for FILE in `find . -type d`; 
    do 
     ls -t -1 -F $FILE | grep -v "/" | grep "^2010" | head -n3 | xargs -I{} mv {} ~; 
    done; 
Questions connexes