web-dev-qa-db-fra.com

Comment lister les derniers fichiers modifiés dans un répertoire spécifique de manière récursive

C’est peut-être une question générique de Linux mais je vais essayer ici.

J'ai besoin d'une liste de fichiers récemment modifiés très souvent et actuellement pour cela je piping ls output to grep avec le param aujourd'hui ou à une certaine heure, mais je dois changer fréquemment le grep param pour obtenir une liste mise à jour, ce qui est un peu peu productif .

Existe-t-il une commande facile pour répertorier les derniers fichiers modifiés sur un certain chemin?

4
Tiberiu C.

Pour rechercher récursivement les 5 derniers fichiers modifiés dans un certain répertoire, exécutez:

find . -type f -printf '%T@ %p\n' | sort -k1,1nr | head -5
  • %T@ avec -printf prédicat de find obtiendra l'heure de modification depuis Epoch pour les fichiers, %p affichera les noms de fichiers

  • sort -k1,1nr inversera numériquement sort le résultat en fonction de l'époque

  • head -5 nous obtiendra les cinq derniers noms de fichiers modifiés

Si vous souhaitez uniquement effectuer une recherche dans le répertoire en cours (pas de manière récursive), utilisez stat:

stat -c '%Y %n' * | sort -k1,1nr | head -5

Ou find:

find . -maxdepth 1 -type f -printf '%T@ %p\n' | sort -k1,1nr | head -5

Vérifiez man find et man stat pour avoir une idée plus précise.

9
heemayl

Le script ci-dessous répertorie tous les fichiers récursivement dans un répertoire, édité il y a moins d'un mois. En outre, il affiche la période écoulée depuis la dernière modification.

Il peut être utilisé avec la commande:

findrecent <directory> <time(in hours)>

comme indiqué ci-dessous:

enter image description here

Dans cet exemple, tous les fichiers de mon bureau modifiés depuis moins de 36 heures sont répertoriés.

Le scénario

#!/usr/bin/env python3
import os
import time
import sys

directory = sys.argv[1]

try:
    t = int(sys.argv[2])
except IndexError:
    t = 1

currtime = time.time(); t = t*3600

def calc_time(minutes):
    # create neatly displayed time
    if minutes < 60:
        return "[edited "+str(minutes)+" minutes ago]"
    else:
        hrs = int(minutes/60); minutes = int(minutes - hrs*60)
        return "[edited "+str(hrs)+" hours and "+str(minutes)+" minutes ago]"

for root, dirs, files in os.walk(directory):
    for file in files:
        file = os.path.join(root, file); ftime = os.path.getctime(file)
        edited = currtime - ftime
        if edited < t:
            print(file, calc_time(int(edited/60)))

Comment utiliser

  1. Créez, s'il n'existe pas encore, le répertoire ~/bin
  2. Copiez le script ci-dessus dans un fichier vide, enregistrez-le sous le nom findrecent in ~/bin
  3. Rendre le script exécutable
  4. Déconnectez-vous et revenez dans et vous avez terminé

Remarque

  • si aucune heure n'est spécifiée, le script répertorie tous les fichiers, édités au cours de la dernière heure
  • si un répertoire contient des espaces, utilisez des guillemets, comme dans l'exemple
3
Jacob Vlijm

C'est si simple en fait. Pour obtenir le fichier le plus récent dans le répertoire actuel:

ls -Art | tail -n 2

Pour obtenir le fichier le plus récent dans un autre répertoire, par exemple dans/opt/spark /:

ls /opt/spark/ -Art | tail -n 1

C'est à ce moment que je l'utilise sur mon cluster:

aa23916@picard03:/opt/spark/applicationHistory$ ls -Art | tail -n 2
app-20180124162809-0004
app-20180124163207-0005.inprogress

Simple et facile : )

1
A Alnafessah