J'écris un script Shell dans lequel je dois trouver la date de dernière modification d'un fichier.
La commande Stat
n'est pas disponible dans mon environnement.
J'utilise donc 'ls'
comme ci-dessous pour obtenir le résultat souhaité.
ls -l filename | awk '{print $6 $7 $8}'
Mais j'ai lu dans de nombreux forums que l'analyse de ls
est généralement considérée comme une mauvaise pratique . Bien que cela fonctionne (probablement) bien la plupart du temps, il n'est pas garanti de fonctionner à chaque fois.
Existe-t-il un autre moyen d'obtenir la date de modification du fichier dans le script Shell?.
Comment utiliser la commande find
?
par exemple.,
$ find filenname -maxdepth 0 -printf "%TY-%Tm-%Td %TH:%TM\n"
Cette chaîne de format particulière donne une sortie comme celle-ci: 2012-06-13 00:05
.
La page de manuel find affiche les directives de formatage que vous pouvez utiliser avec printf
pour adapter le résultat à ce que vous souhaitez/souhaitez. La section -printf format
contient tous les détails.
Comparez la sortie de ls
à find
:
$ ls -l uname.txt | awk '{print $6 , "", $7}'
2012-06-13 00:05
$ find uname.txt -maxdepth 0 -printf "%TY-%Tm-%Td %TH:%TM\n"
2012-06-13 00:05
Bien sûr, vous pouvez écrire des scripts dans un certain nombre de langues telles que Python ou Perl, etc., pour obtenir les mêmes informations, mais demander un "commande unix}" comme si vous recherchiez un "Commande Shell.
MODIFIER:
Vous pouvez également inovke Python à partir de la ligne de commande comme ceci:
$ python -c "import os,time; print time.ctime(os.path.getmtime('uname.txt'))"
ou si combiné avec d'autres commandes Shell:
$ echo 'uname.txt' | xargs python -c "import os,time,sys; print time.ctime(os.path.getmtime(sys.argv[1]))"
les deux retournent: Wed Jun 13 00:05:29 2012
en fonction de votre système d'exploitation, vous pouvez simplement utiliser
date -r FILENAME
La seule version d'Unix sur laquelle cela ne semble pas fonctionner est Mac OS, où, selon les fichiers man, l'option -r est:
-r seconds
Print the date and time represented by seconds, where seconds is
the number of seconds since the Epoch (00:00:00 UTC, January 1,
1970; see time(3)), and can be specified in decimal, octal, or
hex.
au lieu de
-r, --reference=FILE
display the last modification time of FILE
Avez-vous du Perl?
Si c'est le cas, vous pouvez utiliser sa fonction stat
intégrée pour obtenir le mtime (et d'autres informations) sur un fichier nommé.
Voici un petit script qui prend une liste de fichiers et imprime l’heure de modification de chacun:
#!/usr/bin/Perl
use strict;
use warnings;
foreach my $file (@ARGV) {
my @stat = stat $file;
if (@stat) {
print scalar localtime $stat[9], " $file\n";
}
else {
warn "$file: $!\n";
}
}
Exemple de sortie:
$ ./mtime.pl ./mtime.pl nosuchfile
Tue Jun 26 14:58:17 2012 ./mtime.pl
nosuchfile: No such file or directory
Le module File::stat
remplace l'appel stat
par une version plus conviviale:
#!/usr/bin/Perl
use strict;
use warnings;
use File::stat;
foreach my $file (@ARGV) {
my $stat = stat $file;
if ($stat) {
print scalar localtime $stat->mtime, " $file\n";
}
else {
warn "$file: $!\n";
}
}
#!/bin/bash
FILE=./somefile.txt
modified_at=`Perl -e '$x = (stat("'$FILE'"))[9]; print "$x\n";'`
not_changed_since=`Perl -e '$x = time - (stat("'$FILE'"))[9]; print "$x\n";'`
echo "Modified at $modified_at"
echo "Not changed since $not_changed_since seconds"