web-dev-qa-db-fra.com

nom du fichier date de dernière modification Shell dans le script

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?

12
odew

Pourquoi vous ne devriez pas utiliser 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;)

Modifier

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 ).

Donc, une solution non -stat: date d'utilisation

date, 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;)

Une meilleure solution, les systèmes BSD (testée sous OS X, utilisant BSD-stat; GNU stat est légèrement différente mais pourrait fonctionner de la même manière).

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" ./*

  1. stat -f: appelez stat et spécifiez le format (-f).
  2. %m: l'heure de la période UNIX.
  3. %t: un séparateur de tabulation dans la sortie.
  4. %Sm: S dit d'afficher la sortie sous la forme d'une string, m dit d'utiliser les données de modification de fichier.
  5. %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 .

17
simont

avoir perl?

Perl -MFile::stat -e "print scalar localtime stat('FileName.txt')->mtime"
4
jm666

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.

3
Alex Howansky

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

1
user5287944