web-dev-qa-db-fra.com

Commande Unix (autre que 'stat' et 'ls') pour obtenir la date de modification du fichier sans analyse

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

12
AnonGeek

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

20
Levon

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
4
dmo

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";
    }
}
3
Keith Thompson
#!/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"
0
user2081279