obtenir uniquement les noms de fichiers ... triés par jour de modification
find
+ sort
+ cut
approche :
find . -regex ".*/[0-9.]+" -printf "%[email protected] %f\n" | sort | cut -d' ' -f2
-
%[email protected]
- Heure de la dernière modification du fichier, où@
est secondes depuisJan. 1, 1970, 00:00 GMT,
avec partie fractionnaire -
%f
- Nom du fichier avec tous les répertoires principaux supprimés (uniquement le dernier élément)
Pour trier par ordre décroissant :
find . -regex ".*/[0-9.]+" -printf "%[email protected] %f\n" | sort -k1,1r | cut -d' ' -f2
Votre méthode peut être adaptée pour fonctionner dans des cas simples. Le principal problème auquel vous êtes confronté est que vous passez entrée à ls
, mais ls
ne prend aucune entrée. ls
prend des arguments de ligne de commande. Vous devez donc transmettre la sortie de find
comme arguments à ls
, avec une substitution de commande. Aussi, dans le cas où un répertoire correspond, passez -d
à ls
pour lister le répertoire lui-même et non son contenu.
OLDDATA=$(ls -td $(find . -regex ".*/[0-9.]+"))
Seulement dans des cas simples, car il y a deux restrictions :
- Cela repose sur une substitution de commande sans guillemets (tout comme l'utilisation de
$OLDDATA
ensuite). Par conséquent, il suppose que les noms de fichiers ne contiennent aucun caractère spécial (espaces ou caractères génériques\[*?
). - Certaines versions de
ls
peut mutiler des caractères qui ne sont pas imprimables dans les paramètres régionaux actuels. - Si la longueur totale des noms de fichiers est trop longue, vous obtiendrez une erreur. (Notez que
find … -exec
etxargs
ne peut pas aider ici, depuisls
doit s'exécuter une seule fois pour obtenir le bon ordre des noms de fichiers. Tout ce qu'ils peuvent faire, c'est masquer les erreurs et produire une sortie qui n'est pas correctement triée - et mutiler quelques caractères supplémentaires, dans le cas dexargs
.)
Un moyen simple et robuste de le faire consiste à utiliser zsh. Il a la capacité de trier les correspondances génériques, grâce aux qualificateurs globaux.
setopt extended_glob
OLDDATA=(**/[0-9.]##(om))
- Comme cela n'appelle aucun autre programme, il n'y a pas de limite de longueur autre que la mémoire disponible, et aucun risque de modification du nom de fichier à tout moment.
- Le résultat est une liste de chaînes (chaque chaîne étant un nom de fichier), pas une chaîne, donc elle va dans une variable tableau.
**/
parcourt les sous-répertoires de manière récursive, évitant l'utilisation defind
.##
signifie "un ou plusieurs des précédents" dans la syntaxe zsh extended glob, c'est analogue à+
dans la syntaxe regex (étendue).(om)
est un qualificateur global pour trier les fichiers par date de modification, commels -t
.
Il n'existe notoirement aucun moyen simple de le faire de manière robuste avec les outils POSIX ou même avec les outils GNU et ksh.