POSIX a ceci à dire sur les dates dans une ls
-l
liste 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 -q
option spécifiée POSIX également , il est relativement facile de préparer une expression régulière pour un ls
résultat sans find
:
d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"
###OUTPUT###
Jul 5 Jul 4
grep
pour 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
-q
retourner le shell glob ?
plutôt que des caractères non imprimables ou \t
ab dans un nom de fichier
Ces résultats sont transmis au |pipe
fichier sed
auquel correspond uniquement:
- La ligne vide précédant un chemin et la ligne suivante
- Les lignes commençant par
-
(en d'autres termes - pas d
pour 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 cron
bien 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
+ ls
implique plusieurs invocations - cela n'implique qu'un seul ls
processus, et c'est pourquoi il est capable de tout trier de manière fiable - ce qu'il fait par défaut - et sort
est donc également rendu accessoire.
Toute solution impliquant find
et sort
et ls
fait à peu près tout le travail deux fois. ls
et find
résoudra à la fois chaque chemin d'accès et stat
chaque fichier. ls
et sort
triera 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 date
et sed
de 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 date
chaîne pour laquelle nous recherchons, grep
mais 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 **/*(.)