POSIX a ceci à dire sur les dates dans une ls -lliste ong:
Le <date and time>champ doit contenir la date et l'horodatage appropriés de la dernière modification du fichier. Dans l'environnement local POSIX, le champ doit être l'équivalent de la sortie de la commande de date suivante:
date "+%b %e %H:%M"
... si le fichier a été modifié au cours des six derniers mois, ou:
date "+%b %e %Y"
En tenant compte de cela et en veillant à ce qu'il y ait des sauts de ligne dans un nom de fichier, ils sont correctement globalisés avec l' ls -qoption spécifiée POSIX également , il est relativement facile de préparer une expression régulière pour un lsrésultat sans find:
d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"
###OUTPUT###
Jul 5 Jul 4
greppour cela et vous ne renverrez que des lignes contenant les chaînes représentant les dates d'aujourd'hui ou d'hier. La commande suivante ajoute un peu à cela:
ls -alRcq | sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"
ls les options consistent en:
-a retourner tous les fichiers dans un répertoire - y compris ceux qui commencent par un .dot
-l longue liste
-R liste récursivement tous les répertoires enfants
-c afficher l'heure de modification plutôt que l'heure d'accès
-qretourner le shell glob ?plutôt que des caractères non imprimables ou \tab dans un nom de fichier
Ces résultats sont transmis au |pipefichier sedauquel correspond uniquement:
- La ligne vide précédant un chemin et la ligne suivante
- Les lignes commençant par
- (en d'autres termes - pas dpour le répertoire) qui contiennent également votre date.
- Cependant, il n'imprime pas les lignes de chemin sauf si le répertoire qu'ils nomment contient réellement les fichiers pour lesquels vous avez filtré.
La sortie ressemble à ceci:
ls -alRcq --color=always |
sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"
###OUTPUT###
.:
-rw------- 1 mikeserv mikeserv 2086 Jul 4 10:52 .bash_history
-rw------- 1 mikeserv mikeserv 2657 Jul 4 15:20 .lesshst
-rw-r--r-- 1 mikeserv mikeserv 681 Jul 5 05:18 .zdirs
-rw------- 1 mikeserv mikeserv 750583 Jul 5 08:28 .zsh_history
-rw-r--r-- 1 mikeserv mikeserv 166 Jul 4 23:02 Terminology.log
-rw-r--r-- 1 mikeserv mikeserv 433568 Jul 4 13:34 shot-2014-06-22_17-10-16.jpg
-rw-r--r-- 1 mikeserv mikeserv 445192 Jul 4 13:34 shot-2014-06-22_17-11-06.jpg
./.cache/efreet:
-rw------- 1 mikeserv mikeserv 37325 Jul 4 22:51 desktop_localhost_C.eet
-rw------- 1 mikeserv mikeserv 37325 Jul 4 23:30 desktop_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv 24090 Jul 4 22:51 desktop_util_localhost_C.eet
-rw------- 1 mikeserv mikeserv 24090 Jul 4 23:30 desktop_util_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv 16037 Jul 4 23:30 icon_themes_localhost.eet
-rw------- 1 mikeserv mikeserv 3117 Jul 4 23:30 icons___efreet_fallback_localhost.eet
-rw------- 1 mikeserv mikeserv 768039 Jul 4 23:30 icons_gnome_localhost.eet
-rw------- 1 mikeserv mikeserv 18589 Jul 4 23:30 icons_hicolor_localhost.eet
./.config:
-rw-r--r-- 1 mikeserv mikeserv 30 Jul 4 19:10 pavucontrol.ini
./.config/chrome:
-rw-r--r-- 1 mikeserv mikeserv 94332179 Jul 4 13:36 conf.tar.lz4.bak
Oui, cela fonctionne même avec LS_COLORS- ce qui est probablement une faible priorité pour vous cronbien sûr, mais, hé, vos options sont ouvertes.
Dans tous les cas, cela offre des avantages importants par rapport à d'autres solutions possibles.
En premier lieu, find+ lsimplique plusieurs invocations - cela n'implique qu'un seul lsprocessus, et c'est pourquoi il est capable de tout trier de manière fiable - ce qu'il fait par défaut - et sortest donc également rendu accessoire.
Toute solution impliquant findet sortet lsfait à peu près tout le travail deux fois. lset findrésoudra à la fois chaque chemin d'accès et statchaque fichier. lset sorttriera tous les résultats. Il est probablement préférable d'utiliser simplement le single ls.
Ensuite, bien sûr, il y a les parties dateet sedde cette réponse. Ce qui est important à noter à ce sujet, c'est que vous faites la partie difficile et obtenez d'abord l'expression régulière - et une seule fois - et ensuite vous ne taillez qu'une seule liste de résultats plutôt que de dire, obtenir des résultats, obtenir des résultats, trier les résultats et trier les résultats.
Cela ne se casse pas sur les noms de fichiers contenant des sauts de ligne, comme le feront probablement d'autres solutions. Cette solution a ses propres mises en garde - que j'explique ensuite - mais elles sont infimes et faciles à gérer. À mon avis, c'est la solution la plus robuste ici.
Il existe deux cas dans lesquels la commande ci-dessus peut vous poser des problèmes. Le premier implique les ?globes dans les noms de fichiers - alors que c'est déjà une solution plus robuste que toute autre proposée ici, et la probabilité que vous rencontriez un ?du tout est assez petite en soi, il est possible que la résolution de ces globs pourrait correspondre à plus d'un nom de fichier. S'il vous plaît voir ce pour plus d' informations à ce sujet.
L'autre possibilité implique un faux positif - par exemple, si vous avez un nom de fichier correspondant réellement à la datechaîne pour laquelle nous recherchons, grepmais qui n'a pas été réellement modifié aucun de ces jours. Je ne compte pas sur le fait que ce soit un problème, mais, si c'est le cas, posez des questions à ce sujet et je peux probablement vous aider à rendre l'expression régulière plus spécifique afin de gérer cela.
ls -ls **/*(.)