GNU/Linux >> Tutoriels Linux >  >> Linux

Comment trier les résultats de l'instruction Find par date ?

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 depuis Jan. 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 :

  1. 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 \[*? ).
  2. Certaines versions de ls peut mutiler des caractères qui ne sont pas imprimables dans les paramètres régionaux actuels.
  3. Si la longueur totale des noms de fichiers est trop longue, vous obtiendrez une erreur. (Notez que find … -exec et xargs ne peut pas aider ici, depuis ls 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 de xargs .)

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 de find .
  • ## 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, comme ls -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.


Linux
  1. Comment rechercher et trier des fichiers en fonction de la date et de l'heure de modification sous Linux

  2. Comment trouver des fichiers volumineux Linux avec les commandes find et du

  3. Comment répertorier récursivement tous les répertoires d'un emplacement, en largeur d'abord ?

  4. Comment vérifier quel fuseau horaire sous Linux ?

  5. Comment trier les résultats de la commande ls par date de modification (répertoires en premier) ?

Comment rechercher et répertorier récursivement les fichiers par date sous Linux

Comment trouver une adresse IP sous Linux

Comment trouver le nom d'hôte sous Linux

Comment trouver la date et l'heure exactes d'installation de votre système d'exploitation Linux

Comment trouver la date et l'heure d'installation du système d'exploitation Linux

Comment trouver des fichiers dans Debian