Comment puis-je faire un simple find
qui ordonnera les résultats par le plus récemment modifié?
Voici le courant que find
j'utilise (je fais un shell shell en PHP, c'est donc le raisonnement des variables):
find '$dir' -name '$str'\* -print | head -10
Comment pourrais-je avoir cette commande la dernière recherche modifiée? (Remarque: je ne souhaite pas qu'il trie "après" la recherche, mais trouve les résultats en fonction de ce qui a été modifié le plus récemment.)
Réponses:
Utilisez ceci:
printf
arguments deman find
:%Tk
: Heure de la dernière modification du fichier dans le format spécifié park
.@
: secondes depuis le 1er janvier 1970, 00h00 GMT, avec partie fractionnaire.c
: date et heure de la localisation (Sam 04 Nov 12:02:33 EST 1989).%p
: Nom du fichier.la source
~/.zshrc
:fr () { find ./ -iname "*"$@"*" -printf "%T@ %Td-%Tb-%TY %Tk:%TM %p\n" | sort -n | cut -d " " -f 2- | grep -i "$@" ; }
Il trouve tous les fichiers contenant le motif du premier argument passé à la commande (fr <pattern>
) de manière récursive et les trie avec le dernier.find -L ...
ssed
pour vous débarrasser de la fraction de secondes et toujours utiliser ISO8601 comme l'a montré @PeterMortensen:find . -type f -printf "%TY-%Tm-%TdT%TT %p\n" | sort -r | ssed -R 's/^([^.]+)\.\d+ (.*)$/\1 \2/'
La méthode la plus simple consiste à utiliser zsh, grâce à ses qualificatifs glob .
Si vous avez GNU find, faites-lui imprimer les temps de modification du fichier et triez-le en conséquence.
Si vous avez GNU find mais pas d'autres utilitaires GNU, utilisez des nouvelles lignes comme séparateurs au lieu de NULL; vous perdrez le support pour les noms de fichiers contenant des nouvelles lignes.
Si vous avez Perl (ici, je supposerai qu'il n'y a pas de nouvelles lignes dans les noms de fichiers):
Si vous avez Python (en supposant également qu'il n'y a pas de nouvelles lignes dans les noms de fichiers):
Il existe probablement un moyen de faire la même chose en PHP, mais je ne le sais pas.
Si vous voulez travailler uniquement avec les outils POSIX, c'est un peu plus compliqué. voir Comment lister les fichiers triés par date de modification de manière récursive (pas de commande stat disponible!) (retatiner les 10 premiers est la partie facile).
la source
find
version montre les fichiers les plus anciens, et que vous devez ajouter l'-r
option àsort
.Vous n'avez pas besoin de PHP ou Python, juste ls :
Si la commande * se termine avec un statut d'échec (c'est-à-dire une liste d'arguments trop longue ), vous pouvez effectuer une itération avec find. Paraphrasé dans: La longueur maximale des arguments pour un nouveau processus
find . -print0|xargs -0 command
(optimise la vitesse, si find n'implémente pas "-exec +" mais connaît "-print0")find . -print|xargs command
(s'il n'y a pas d'espace blanc dans les arguments)Si la majeure partie des arguments consiste en des chemins longs, absolus ou relatifs, essayez de déplacer vos actions dans le répertoire:
cd /directory/with/long/path; command *
une autre solution rapide consiste peut-être à faire correspondre moins d'arguments:command [a-e]*; command [f-m]*; ...
la source
Vous n'avez besoin que de ls
Vous pouvez faire
find /wherever/your/files/hide -type f -exec ls -1rt "{}" +;
comme indiqué ci-dessus,ou
la source
xargs
appelezls
plusieurs fois, le tri sera interrompu.+;
à la fin? Il semble donner le même résultat sans le;
mais cela ne fonctionne pas sans le+
?Extension de la réponse de l'utilisateur195696 :
Pour chaque fichier, cette première sortie l'horodatage numérique (pour le tri par, suivi par tabulation
\t
), puis un horodatage lisible par l' homme, le filesize (malheureusementfind
de-printf
ne peut pas faire dans mebibytes, seulement kibibytes), puis le nom du fichier avec le parent chemin.Puis le
sort -n
trie par le premier champ numérique.Puis
cut
se débarrasse de ce premier champ numérique qui n’a aucun intérêt pour l’utilisateur. (Imprime le deuxième champ en avant.) Le séparateur de champ par défaut est\t
ou tabulation.Exemple de sortie:
J'ai délibérément créé 6 caractères pour le champ de taille de fichier, car si on le rend plus long, il devient difficile de distinguer visuellement la taille des fichiers. Ainsi, les fichiers dont la taille est supérieure à 1e6 Ko font saillie: par 1 caractère signifie entre 1 et 9 Go, par 2 caractères, entre 10 et 99 Go, etc.
Edit: voici une autre version (depuis le
find . -printf "%Tc"
crash de MinGW / MSYS):Donner une sortie comme:
Où:
-I{}
provoque le{}
remplacement de l'occurrence par un argument, et les nouvelles lignes sont maintenant les séparateurs d'arguments (notez les espaces dans les noms de fichiers ci-dessus).ls -G
supprime l’impression du nom du groupe (perte d’espace).ls -h --si
produit des tailles de fichiers lisibles par l’homme (plus correct avec--si
).ls -t
trie par le temps, ce qui est sans importance ici, mais c'est ce que j'utilise généralement.la source
T@
par pars
dans l’une des commandes ci-dessus.Variante OS X de la réponse de @ user195696:
Avec horodatage:
Sans horodatage:
la source
J'ai constaté que cela se fait sous Mac OS X (et suffisamment générique pour fonctionner également sur d'autres Unixen):
la source
Si votre
find
sélection est très simple, vous pourrez peut-être vous en passer et utilisez simplementls
:la source
Essayer:
Mais il est également utile de filtrer les données par
-mmin
/-mtime
et-type
.la source
Utilisation:
Cette commande va trier les fichiers par date de modification.
Et afficher comme:
la source
J'ai une solution simple qui fonctionne à la fois pour FreeBSD (OS X) et Linux:
la source
Je ne pense pas qu’il
find
existe une option pour modifier l’ordre de sortie.-mtime
et-mmin
vous permettra de limiter les résultats aux fichiers qui ont été modifiés dans une certaine fenêtre temporelle, mais le résultat ne sera pas trié - vous devrez le faire vous-même. GNUfind
a une-printf
option qui vous permettra, entre autres, d’imprimer l’heure de modification de chaque fichier trouvé (chaînes de format%t
ou%Tk
); cela pourrait vous aider à trier lafind
sortie comme vous le souhaitez.la source
J'ai amélioré la réponse Akash en rendant le script gérant correctement les espaces dans les noms de fichiers:
la source
Si vous souhaitez commander tous les fichiers PNG par heure dans
$PWD
:Ce simple one-liner donne toute la souplesse d’expression rationnelle, encore
find
et encorels
.la source
Vous pouvez utiliser
stat
sur BSD et Linux (pas sur POSIX) de cette manière:Si vous voulez limiter le nombre:
la source
Il y a un moyen propre et robuste de
sort | head
par date:Utilisation
ls -l
de jolis imprimésEn tant que fonction bash :
Cela pourrait être exécuté avec un ou deux arguments, voire sans:
Échantillon:
Répertorera tous les non répertoires triés par date Nota:
Même sur un grand système de fichiers, comme la
xargs
liste déjà triée est reçue, l'ordre des fichiers reste correct, même s'ills
doit être exécuté plusieurs fois.Répertoriera 12 répertoires non récents plus récents triés par date, avec la taille imprimée sous une forme lisible par l'homme
Fera la liste de 42 liens symboliques plus récents
Dresse la liste de tous les liens symboliques, blocs, sockets et périphériques de caractères, triés par date.
Inverser l'ordre
Remplacement
head
partail
et changer le commutateur desort
etls
:Même fonction, même usage:
la source
Si vous voulez juste obtenir un chemin complet pour chaque article, vous pouvez écrire comme ceci.
Où
-printf "% T @% p \ n" pour donner les critères de tri (date),
'sort -nr' pour trier par date,
tête -10 pour répertorier les 10 meilleurs résultats,
couper -d '' -f 2 pour couper les horodatage principal sur chaque ligne.
la source
cut -d ' ' -f 2
se cassera si les noms de fichiers contiennent des espaces.J'ai une solution simple.
Après
cd
un répertoire, utilisezfind . -iname "*" -ls
la source