J'ai un fichier nommé avec YYYYMMDD
dans le nom de fichier, tel que
file-name-20151002.txt
Je veux déterminer si ce fichier a été modifié après le 2015-10-02.
Remarques:
- Je peux le faire en regardant la sortie de
ls
, mais je sais que l'analyse de la sortie dels
est une mauvaise idée. - Je n'ai pas besoin de trouver tous les fichiers datés après une date spécifique, il suffit de tester un fichier spécifique à la fois.
- Je ne suis pas préoccupé par la modification du fichier à la même date après sa création. Autrement dit, je veux juste savoir si ce fichier avec
20151002
le nom a été modifié le 3 octobre 2015 ou plus tard. - Je suis sur MacOs 10.9.5.
bash
files
osx
timestamps
Peter Grill
la source
la source
Réponses:
Voici quelques façons possibles avec:
OSX stat
:GNU date
:zsh
seulement:Usage:
Exemple de sortie:
ou
la source
Le script suivant vérifiera les dates de tous les fichiers spécifiés sur la ligne de commande:
Il nécessite des versions GNU de
sed
,date
etstat
Voici une version qui n'a pas été testée mais qui devrait fonctionner sur Mac (et sur FreeBSD, etc.) si j'ai lu correctement les pages de manuel en ligne:
la source
sed: illegal option -- r
avec MacOS 10.9.5.-r
est unesed
option GNU pour lui dire d'utiliser des expressions régulières étendues. Vous pouvez changer le script sed pour utiliser une expression rationnelle de base plutôt que étendue (par exemple,sed -e 's/^.*\(2015\)/\1/')
mais le reste du script échouera probablement encore car il nécessite les versions GNU dedate
etstat
, et je ne pense pas que les Mac les accompagnent en standard (bien qu'ils soient disponible pour Mac dans des packages pré-compilés)Utiliser bash et
stat
etexpr
pour obtenir les dates sous forme de nombres et les comparer:C'était ma réponse précédente spécifique à Linux.
L'
=~
opérateur d'expression rationnelle bash capture les 8 chiffres du nom de fichier dans le tableau bash BASH_REMATCH.[[ ]]
compare les chaînes, bien que vous les compariez simplement sous forme de nombres à la place[ -gt ]
.la source
-c
possibilitéstat
.stat -f %m -t %F "$file"
. Désolé, je ne peux pas le tester.stat
de selon votre commentaire, les choses semblent s'exécuter mais pas de sortie pour tous les cas de test. Mais que"$file" =~ ([0-9]{8}).txt$
fait-on?.txt
la fin du nom de fichier. Les parenthèses()
capturent la partie à 8 chiffres, et vous pouvez la trouver dans${BASH_REMATCH[1]}
.if [[=~]]
vous pouvez essayer le basiqueif filedate=$(expr "$file" : '.*-\([0-9]*\).txt')
, puis le remplacer${BASH_REMATCH[1]}
par$filedate
.Vous pouvez faire ceci:
touch
commande (en ajoutant 0 pour heure / minute / seconde) pour définir la date de modification du fichier temporaireParce que votre question concerne
bash
, vous utilisez probablement Linux. Letest
programme utilisé sous Linux (partie de coreutils ) a des extensions pour la comparaison d'horodatage (-nt
et-ot
) non trouvées dans POSIXtest
.POSIX commente ceci dans la justification de
test
:En utilisant cette extension, vous pourriez alors
-nt
opérateurtest
pour effectuer la comparaison que vous avez demandée.Voici un exemple. Une clarification par OP a mentionné la plate-forme, donc on pourrait utiliser
stat
comme alternative aux fichiers temporaires (comparer OSX et Linux ):la source
trap
commande.Une autre
zsh
approche:Rapporterait les fichiers qui ont quelque chose qui ressemble à un horodatage dans leur nom mais qui ne correspond pas à leur dernière heure de modification.
zsh
a une pléthore d'opérateurs comme ça pour manipuler les globes et les variables. Il est très pratique de faire n'importe quel travail rapidement (et généralement de manière fiable), mais il est assez difficile de les comprendre tous et cela produit souvent ce que nous appelons habituellement du code en écriture seule (euphémisme pour code illisible, mais implique également que vous ne le faites pas '' t besoin de le lire pendant que vous l'écrivez pour un usage unique à l'invite de commande)Un rapide tour d'horizon:
**/pattern(qualifier)
: glob récursif avec qualificatif glob.[0-9](#c8)
correspond à 8 chiffres. C'est zsh extendedglob équivalent deksh
« s{8}([0-9])
.D
: inclure des fichiers cachése@...@
: le qualificatif eval glob pour exécuter du texte afin de qualifier davantage les fichiers. Chemin d'accès au fichier transmis$REPLY
zstat...
récupérer le mtime au format YYYYMMDD dans le$m
tableau.${REPLY:t}
: s'étend à la queue t (le nom de base) du fichier.${(SM)something#pattern}
. Extrayez le motif de correspondance des pièces de quelque chose . CeuxS
( S recherche ubstring) etM
(étendre à M partie atched) sont appelés drapeaux d'extension des paramètres .la source