223 votes

Unix/Linux rechercher et trier par date de modification

Comment puis-je faire un simple find qui ordonnerait les résultats par ordre de modification la plus récente ?

Voici l'actuel find J'utilise (je fais un Shell escape en PHP, c'est donc le raisonnement pour les variables) :

find '$dir' -name '$str'\* -print | head -10

Comment puis-je faire en sorte que la recherche soit ordonnée en fonction des dernières modifications ? (Notez que je ne veux pas que le tri se fasse "après" la recherche, mais plutôt que les résultats soient classés en fonction des dernières modifications).

0 votes

github.com/shadkam/recentmost ferait ce que l'on souhaite, mais il faut le construire.

12voto

skippy1910 Points 137

Vous n'avez besoin que de ls

Vous pourriez faire find /wherever/your/files/hide -type f -exec ls -1rt "{}" +; comme indiqué ci-dessus,

o

ls -1rt `find /wherever/your/file/hides -type f`

3 votes

S'il y a beaucoup de fichiers, cela échoue avec 'Argument list too long' sur le ls. Peut-être faut-il utiliser xargs ?

4 votes

Mais si xargs appelle ls plusieurs fois, le tri sera rompu.

0 votes

Cela échoue pour les fichiers dont le nom contient des espaces. Un conseil ?

7voto

user9399 Points 171

La variante OS X de La réponse de @user195696 :

  1. Avec horodatage :

     find . -type f -exec stat -f "%Sm %N" -t "%Y%y%m%d%H%M" {} \; | sort -r
  2. Sans horodatage :

     find . -type f -exec stat -f "%Sm %N" -t "%Y%y%m%d%H%M" {} \; | sort -r | awk -F' ' '{ print substr($0, length($1) + 2) }'

    ou, alternativement,

     find . -type f -exec stat -f "%Sm %N" -t "%Y%y%m%d%H%M" {} \; | sort -r | cut -d ' ' -f2-

Comme pour la plupart des autres réponses, cela échouera pour les noms de fichiers qui contiennent une ou plusieurs nouvelles lignes, mais cela devrait fonctionner pour les noms de fichiers qui contiennent des espaces (horizontaux).

3voto

Brandon Belvin Points 360

Voici un moyen propre et robuste pour sort | head par date :

Utilisation de ls -l pour un joli imprimé

find . ! -type d -printf "%T@ %p\0" |
    sort -zrn |
    head -zn 10 |
    sed -z 's/^[0-9.]\+ //' |
    xargs -0 ls -lt

En tant que bash fonction :

findByDate() {
    local humansize=''
    [ "$1" = "-h" ] && humansize='h' && shift
    find . ${2:-! -type d} -printf "%T@ %p\0" |
        sort -zrn |
        head -zn ${1:--0} |
        sed -z 's/^[0-9.]\+ //' |
        xargs -0 ls -dlt${humansize}
}

On peut l'exécuter avec un ou deux arguments, ou même sans :

Usage: findByDate [-h] [lines] [find options]

Échantillon :

findByDate

Listera tous les non répertoires triées par date. Nota :

Même sur un grand arbre de système de fichiers, comme xargs recevoir une liste déjà triée, l'ordre des fichiers reste correct, même si ls doit être exécuté plusieurs fois.

findByDate -h 12

Je vais énumérer 12 autres récents non répertoires triées par date, avec la taille imprimée en lisible par l'homme formulaire

findByDate 42 '-type l'

Listera 42 liens symétriques plus récents

findByDate -0 '( -type l -o -type b -o -type s -o -type c )'

Listera tous les liens symboliques, les périphériques de bloc, les sockets et les périphériques de caractères, triés par date.

Inversion de l'ordre

Remplacement de head par tail et changer l'interrupteur de sort y ls :

findByDate() {
    local humansize=''
    [ "$1" = "-h" ] && humansize='h' && shift
    find . ${2:-! -type d} -printf "%T@ %p\0" |
        sort -zn |
        tail -zn ${1:-+0} |
        sed -z 's/^[0-9.]\+ //' |
        xargs -0 ls -dltr${humansize}
}

Même fonction, même usage :

Usage: findByDate [-h] [lines] [find options]

2voto

Bryan Petty Points 121

J'ai trouvé que cela fait l'affaire sur Mac OS X (et suffisamment générique pour fonctionner aussi sur d'autres Unixen) :

find . -type f -ls | awk '{print $(NF-3), $(NF-2), $(NF-1), $NF}' | sort

3 votes

Malheureusement, cela imprime les noms de mois localisés sur mon installation croate, ce qui rend le tri incorrect.

0 votes

La réponse de l'utilisateur195696 fonctionne pour le dispositif croate (et d'autres).

1voto

Essayez :

find '$dir' -name '$str'\* -print | xargs ls -tl | head -10

Mais il est également utile de filtrer les données par -mmin / -mtime y -type .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X