nom de fichier date de dernière modification de shell dans le script
Je suis en utilisant bash pour créer un script où je vais obtenir un nom de fichier dans une variable, puis avec cette variable obtenir le fichier unix date de dernière modification.
J'ai besoin d'obtenir cette modification de la valeur de date et je ne peux pas utiliser la commande stat.
Connaissez-vous une façon de l'obtenir avec la commune de disponible *nix commandes?
Si possible avec un configurable format de date.
Et pourquoi ne pouvez-vous pas utiliser
stat n'est pas disponible dans l'environnement, je suis actuellement en train de travailler.
Si ma réponse ne fonctionne pas (
J'ai besoin d'un portable ou une solution robuste, je suis dans un HP-UX système et ce script devrait également fonctionner sous Linux. Pas de perl.
Et pourquoi ne pouvez-vous pas utiliser
stat
?stat n'est pas disponible dans l'environnement, je suis actuellement en train de travailler.
Si ma réponse ne fonctionne pas (
date
ne prend pas en charge la -r
drapeau), pourriez-vous fournir des informations de plate-forme, - vous avez marqués avec Linux
et Unix
; stat
et date
sont à la fois (autant que je sache) assez répandu sur les différentes distributions Linux que j'ai rencontré.J'ai besoin d'un portable ou une solution robuste, je suis dans un HP-UX système et ce script devrait également fonctionner sous Linux. Pas de perl.
OriginalL'auteur odew | 2012-06-26
Vous devez vous connecter pour publier un commentaire.
Pourquoi vous ne devriez pas utiliser
ls
:Analyse
ls
est une mauvaise idée. Non seulement le comportement de certains caractères dans les noms de fichier définis et plate-forme de personne à charge, à vos fins, il vous mess avec les dates où ils sont six mois dans le passé. En bref, oui, il va probablement travailler pour vous dans votre test limitée. Il pas être indépendant de la plateforme (donc pas de portabilité) et le comportement de votre analyse est pas garanti compte tenu de la gamme des "légal" des noms de fichiers sur les différents systèmes. (Ext4, par exemple, autorise les espaces et retours à la ligne dans les noms de fichiers).Ayant dit que, personnellement, j'utiliserais
ls
parce qu'il est rapide et facile 😉Modifier
Comme l'a souligné Hugo dans les commentaires, l'OP ne veut pas l'utiliser
stat
. En outre, je tiens à souligner que la section ci-dessous est BSD-stat spécifique (les%Sm
drapeau ne fonctionne pas quand je l'ai tester sur Ubuntu; Linux a unstat
commande, si vous êtes intéressé par la lecture de l' page de man).Donc, un non-
stat
solution: utiliser datedate
, au moins sur Linux, est un indicateur:-r
, qui, selon le page de man:Donc, la solution de script serait similaire à ceci:
qui vous fera retourner à quelque chose de similaire à ceci:
À l'adresse de l'OP commentaire:
date
a un assez vaste ensemble de temps-format des variables; lire la page de manuel pour plus d'informations.Je ne suis pas 100% sûr de savoir comment portable
date
est dans tous 'les systèmes de type UNIX'. Pour BSD (tels que OS X), ce sera pas de travail; la-r
drapeau de la BSD-date de mise en quelque chose de complètement différent. La question n'est pas " spécifier exactement comment portable une solution est nécessaire pour être. Pour un BSD à base de solution, voir la section ci-dessous 😉Une meilleure solution, les systèmes BSD (testé sur OS X, à l'aide de BSD-stat; GNU stat est légèrement différente, mais pourrait fonctionner de la même manière).
Utilisation
stat
. Vous pouvez formater la sortie destat
avec le-f
drapeau, et vous pouvez choisir d'afficher uniquement les fichiers de modification de données (qui, pour cette question, est de nice).Par exemple,
stat -f "%m%t%Sm %N" ./*
:Où le premier bit est le UNIX époque, la date est la date de modification du fichier, et le reste est le nom de fichier.
Répartition de l'exemple de commande
stat -f "%m%t%Sm %N" ./*
stat -f
: appelstat
, et de spécifier le format (-f
).%m
: L'époque UNIX temps.%t
: Un onglet de l'élément de séparation dans la sortie.%Sm
:S
dit pour afficher le résultat sous la forme d'unstring
,m
dit d'utiliser la modification du fichier de données.%N
: Afficher le nom du fichier en question.Une commande dans votre script le long des lignes suivantes:
vous donnera de sortie tels que:
Lire la page de man pour
stat
pour de plus amples informations; timestamp mise en forme se fait parstrftime
.stat
depuis qu'il a besoin de cela pour être portable sur tous les systèmes unix.date
ne fonctionne pas sur BSD (testé sur OpenBSD).stat
ne, mais ne fonctionne pas sur linux.Yep. Comme indiqué dans la réponse;
date
n'est pas portable sur les systèmes BSD, qui est pourquoi j'ai quitté lestat
section dans la réponse. Je ne suis pas certain qu'il y est une solution portable; réponse contenantfind
n'est pas portable sur mes systèmes BSD, soit.Vous vous plaignez que
ls -l
n'est pas portable, maisdate
est encore moins portable. Le problème est que les systèmes BSD également utiliser le-r
paramètre, mais à des fins différentes. En d'autres termes, à l'aide de la-r
peut-être une commande valide (code de sortie = 0), mais ne pas obtenir les résultats que vous voulez.La réponse mentionne que
date
n'est pas portable pour BSD-pour les systèmes. À l'aide dels
n'est pas portable parce qu'il n'est pas garanti de fonctionner sur aucun plate-forme. Cela contraste avec les deuxdate
etstat
qui ne sont pas de portable parce que le documentée mise en œuvre des outils diffère de plate-forme à la plate - forme ils sont différents outils.ls
est le outil avec un comportement indéterminé pour juridique entrées. (Je dis bien personnellement, j'utiliseraisls
, si...) je ne suis pas convaincu qu'il y a de bonnes, de la croix-plate-forme de solution à ce type de problème.OriginalL'auteur simont
ont perl?
OriginalL'auteur jm666
Comment sur:
Voir la trouver manuel pour d'autres valeurs que vous pouvez utiliser avec %T.
-printf
n'est pas un argument valide.OriginalL'auteur Alex Howansky
Vous pouvez utiliser la commande "date" d'ajouter le format de votre choix, l'option du format:
OriginalL'auteur user5287944
Vous pouvez utiliser
ls -l
qui indique la date de dernière modification, et ensuite utilisercut
pour couper la date de modification:Cela fonctionne sur mon système, car la date apparaît entre les colonnes de 35 à 46. Vous pourriez avoir à jouer avec il sur votre système.
La date est dans deux formats différents:
Mmm dd hh:mm
Mmm dd yyyy
Fichiers modifiés plus d'un an aura le plus tard format. Les fichiers modifiés moins d'un an aura pour premier format. Vous pouvez rechercher un ":" et de connaître le format du fichier est:
ls
est généralement considéré comme une mauvaise pratique. Alors que (probablement) fonctionne très bien, il n'est pas garanti, et ne peut pas être considéré comme portable ou robuste.Et la solution? Vous êtes supposé utiliser shell script et plus ou moins standard des outils qui, pour moi, cela signifie que vous ne pouvez pas utiliser un langage de script comme Perl ou Python. Vous pouvez également utilisez pas de stat. Avec ces restrictions, il n'y a pas beaucoup à gauche, sauf pour l'analyse
ls
. Comme je l'ai dit dans mon post, il pourrait ne pas fonctionner exactement la même chose sur l'OP du système.OriginalL'auteur David W.