J'utilise bash pour construire un script où je vais obtenir un nom de fichier dans une variable et ensuite avec cette variable, obtenir le fichier unix la date de dernière modification.
Je dois obtenir cette valeur de date de modification et je ne peux pas utiliser la commande stat.
Savez-vous un moyen de l'obtenir avec les commandes communes disponibles * nix?
ls
:Analyser ls
est une mauvaise idée . Non seulement le comportement de certains caractères dans les noms de fichiers n'est pas défini et dépend de la plate-forme, mais, pour vous, il va déranger avec les dates où il y a six mois . En bref, oui, cela fonctionnera probablement pour vous dans vos tests limités: not sera indépendant de la plate-forme (donc pas de portabilité) et le comportement de votre analyse sera not garanti. compte tenu de la gamme de noms de fichiers «légaux» sur différents systèmes (Ext4, par exemple, autorise les espaces et les nouvelles lignes dans les noms de fichiers ).
Cela dit, personnellement, j’utiliserais ls
parce que c’est rapide et facile;)
Comme Hugo l'a souligné dans les commentaires, le PO ne veut pas utiliser stat
. De plus, je dois signaler que la section ci-dessous est spécifique à BSD-stat (le drapeau %Sm
ne fonctionne pas lorsque je teste sur Ubuntu; Linux a une commande stat
, si vous êtes intéressé, lisez le man page ).
stat
: date d'utilisationdate
, du moins sous Linux, a un drapeau: -r
qui, selon la page de manuel :
affiche la dernière heure de modification de FILE
Ainsi, la solution scriptée serait semblable à ceci:
date -r ${MY_FILE_VARIABLE}
ce qui vous rendrait quelque chose de similaire à ceci:
zsh% date -r MyFile.foo
Thu Feb 23 07:41:27 CST 2012
Pour répondre au commentaire du PO:
Si possible avec un format de date configurable
date
a un ensemble assez étendu de variables de format de temps; lisez la page de manuel pour plus d'informations.
Je ne suis pas sûr à 100% de la portabilité de la variable date
dans tous les «systèmes de type UNIX». Pour les systèmes basés sur BSD (tels que OS X), cela fonctionnera non; L'indicateur -r
pour la date BSD fait quelque chose de complètement différent. La question ne précise pas exactement à quel point une solution doit être portable. Pour une solution basée sur BSD, voir la section ci-dessous;)
Utilisez stat
. Vous pouvez formater la sortie de stat
avec l'indicateur -f
et choisir d'afficher uniquement les données de modification de fichier (qui, pour cette question, correspond à Nice).
Par exemple, stat -f "%m%t%Sm %N" ./*
:
1340738054 Jun 26 21:14:14 2012 ./build
1340738921 Jun 26 21:28:41 2012 ./build.xml
1340738140 Jun 26 21:15:40 2012 ./lib
1340657124 Jun 25 22:45:24 2012 ./tests
Où le premier bit est le UNIX Epoch time , la date est l'heure de modification du fichier et le reste est le nom du fichier.
Répartition de la commande exemple
stat -f "%m%t%Sm %N" ./*
stat -f
: appelez stat
et spécifiez le format (-f
).%m
: l'heure de la période UNIX.%t
: un séparateur de tabulation dans la sortie.%Sm
: S
dit d'afficher la sortie sous la forme d'une string
, m
dit d'utiliser les données de modification de fichier.%N
: Affiche le nom du fichier en question.Une commande dans votre script dans les lignes suivantes:
stat -f "%Sm" ${FILE_VARIABLE}
vous donnera des résultats tels que:
Jun 26 21:28:41 2012
Lisez la page de manuel pour stat
pour plus d’informations; le formatage de l’horodatage est fait par strftime
.
avoir perl?
Perl -MFile::stat -e "print scalar localtime stat('FileName.txt')->mtime"
Que diriez-vous:
find $PATH -maxdepth 1 -name $FILE -printf %Tc
Reportez-vous à la page de manuel de recherche pour connaître les autres valeurs que vous pouvez utiliser avec% T.
Vous pouvez utiliser la commande "date" en ajoutant l'option de format souhaitée au format:
date +%Y-%m-%d -r /root/foo.txt
2013-05-27
date +%H:%M -r /root/foo.txt
23h02