Trier les fichiers dans le répertoire de manière récursive en fonction de la dernière date de modification

11

Trier les fichiers dans le répertoire de manière récursive en fonction de la dernière date de modification

J'ai modifié beaucoup de fichiers dans mon répertoire, je veux savoir quels sont ces fichiers en les triant par la dernière date de modification et en ce que je veux que certaines extensions soient exclues

dans le répertoire svn j'ai aussi beaucoup de fichiers .svn que je ne veux pas montrer dans le tri

Danny
la source
Je montre comment exclure l'extension dans ma réponse.
mikeserv

Réponses:

18
find -printf "%TY-%Tm-%Td %TT %p\n" | sort -n

vous donnera quelque chose comme

31/03/2014 04: 10: 54.8596422640 ./foo
2014-04-01 01: 02: 11.9635521720 ./bar

n.st
la source
Puis-je exclure une extension de fichier du dossier ....
Danny
@Danny Oui, c'est facile avec find: find -not -iname '*.ext'.
2014
find -not -path " svn " -not -name "* svn" -printf "% TY-% Tm-% Td% TT% p \ n" | sort -n c'est exactement ce dont j'avais besoin merci beaucoup @ n.st
Danny
5

Si vous souhaitez aplatir la structure des répertoires (triant ainsi par date tous les fichiers de tous les répertoires, en ignorant le répertoire dans findlequel se trouvent les fichiers), l' approche-suggérée par @yeti est la solution. Si vous souhaitez conserver la structure du répertoire, vous pouvez essayer

$ ls -ltR /path/to/directory

qui trie en fonction du répertoire.

Andreas Wiese
la source
1
cela me donne un dossier sage où ce dont j'ai besoin est tous ensemble quels sont les fichiers récemment modifiés
Danny
5

En bash, exécutez en shopt -s globstarpremier. Dans ksh93, exécutez en set -o globstarpremier. Dans zsh, vous êtes déjà configuré.

ls -dltr **/*

Cela retournera une erreur si vous avez tellement de fichiers que la limite de longueur de ligne de commande sur votre système est dépassée. Dans zsh, vous pouvez utiliser ceci à la place:

print -rl -- **/*(Om)
Gilles 'SO- arrête d'être méchant'
la source
C'est la seule réponse ici qui fonctionne pour Solaris 10, merci! :)
laxxy
3

En supposant que vous utilisez GNU find, essayez:

find $SOMEPATH -exec stat -c '%Y %n' '{}' + | sort -n

la source
1
Vous pouvez utiliser findl' -printfoption de pour éviter d'appeler un processus distinct (ou plusieurs, selon le nombre de fichiers). Voir ma réponse pour un exemple.
1er
1
Sachant qu'il y a d'autres façons de le faire, j'ai voulu donner statune chance et montrer -exec ... +. Vraiment! Parfois, je pense que cela statmérite plus d'attention ... et personne ne devrait prendre des recettes d'ici sans lire les ingrédients et penser aux conséquences ...
Btw ... toutes les trouvailles n'ont pas -printf...
1
@yeti - Si votre findn'a pas -printf, vous pouvez utiliser -exec sh -c 'printf...'pour obtenir la plupart des mêmes fonctionnalités. Cela comprendrait également l'accès à $(pwd)des chemins pleinement qualifiés.
mikeserv du
2
J'ai rencontré beaucoup d'utilisateurs Linux qui n'avaient jamais lu stat. Alors parfois, je veux juste attirer l'attention sur stat... je pense que statça le mérite ...
2

Pour répertorier de manière fiable les noms de fichiers uniquement à l'aide des outils GNU récents:

find . -printf '%A@ %p\0' |
  sort -nz |
  sed -z 's/^[^ ]* //' |
  tr '\0' '\n'
Graeme
la source
2
find $DIR -depth -maxdepth 3 \
    -type d -readable -printf \
    'printf "\\n%p\\n"
    ls -t --color=always "%p"\n' |\
    . /dev/stdin 2>&-

Cela évite tous les problèmes de liste d'arguments car le seul argument lsjamais reçu est le nom du répertoire que vous souhaitez répertorier. Vous pouvez le faire avec tout ce que vous aimez.

La coquille juste . sourcesle |pipecomme un script shell - il est le même processus et ne pas les problèmes que vous pouvez rencontrer lors execveest appelé.

Dans tous les cas - ce qui précède ne va que de trois profondeurs qui est réglable en changeant maxdepth. Il est également profond en premier - afin que vous reveniez à votre répertoire actuel à partir de depth.

Vous remarquerez peut-être que vous obtenez également $LSCOLORS- sur ma machine, il fournit également des colonnes soigneusement imprimées et tout ce que vous souhaitez ls- ou, d'ailleurs, tout ce que vous pouvez imaginer que vous voudriez faire avec. source.

AUCUN SVN

Encore une fois, cela fera tout ce que vous attendez de ls. Cacher des .svnfichiers est donc aussi simple que de changer la lsligne en:

ls -t --color=always --hide="*svn" "%p"\n

Ou si vous voulez voir des svnextensions dans chaque dossier MAIS ./svnvous pouvez le changer pour que la commande entière ressemble à ceci:

    find $DIR -depth -maxdepth 3 \
        -type d -readable -printf \
            'printf "\\n%p\\n" ; hide=
            [ "%p" = "./svn" ] && hide="*svn"
            ls -t --color=always --hide="$hide" "%p"\n' |\
    . /dev/stdin 2>&-

Personnellement, je l'aime avec ls -set, si vous le souhaitez, -utriera par temps d'accès plutôt que par heure de mod.

mikeserv
la source
1

Celui-ci répertoriera tout files en <dir>haut avec le plus ancien étant le plus ancien modifié

find <dir> -type f -print0 | xargs -0 ls -ltr

Et avec cela, la dernière modification est la plus élevée

find <dir> -type f -print0 | xargs -0 ls -lt

Notez que cela ne fonctionne que si la liste des noms de fichiers ne dépasse pas la limite de longueur totale de ligne de commande sur votre système.

UnX
la source
vrai, j'ai oublié ça
UnX
pour référence sur la commande: liste d'arguments trop longue in-ulm.de/~mascheck/various/argmax
UnX
@ Gilles: Vous voulez dire xargs -0(dans les deux cas).  xargs -print0est équivalent à xargs -p -r -i -n -t -0ou xargs -inprt0ou xargs -0ntrip, ce qui n'est probablement pas ce que vous vouliez dire.
Scott