在Linux上,这很容易用“stat -c%y”来完成,它返回类似于2009-11-27 11:36:06.000000000 +0100
。 在Unix上我找不到任何等价物。
我找到了这个:
ls --time-style='+%d-%m-%Y %H:%M:%S' -l
其中导出这样的东西:
root:~# ls --time-style='+%d-%m-%Y %H:%M:%S' -l total 0 -rw-r--r-- 1 root root 0 16-04-2015 23:14:02 other-file.txt -rw-r--r-- 1 root root 0 16-04-2015 23:13:58 test.txt
根据我的Mac上的手册页(具有BSD标准版本的stat),您可以在几秒钟内获得修改的时代版本:
stat -f %m /etc/passwd
或者如果你想在几个小时内打印出来:mins:secs你可以这样做:
perl -e "print scalar(localtime(`stat -f %m /etc/passwd`))"
以下给出了自Epoch以来以秒为单位的最后修改时间:
stat -c%Y <file>
find命令是各种文件信息的良好来源,包括修改时间到第二个:
find /etc/passwd -maxdepth 0 -printf "%TY/%Tm/%Td %TH:%TM:%.2TS\n" 2011/11/21 13:41:36
第一个参数可以是一个文件。 maxdepth防止搜索是否给出目录名称。 %T指示它打印上次修改时间。
某些系统将%TS解释为浮点秒(例如36.8342610)。 如果你想分数秒使用“%TS”而不是“%.2TS”,但是你可能看不到每个系统上的小数秒。
对于面临相同问题的任何人,我都找不到解决方案(无论如何,在HP-UX 11i上)。 结束了为我的需要编码个性化的“ls -lh”。 这不是那么难打印像这样的东西:
- 664 rw-/rw-/r-- 1L expertNoob adm 8.37 kB 2010.08.24 12:11:15 findf1.c d 775 rwx/rwx/rx 2L expertNoob adm 96 B 2010.08.24 15:17:37 tmp/ - 775 rwx/rwx/rx 1L expertNoob adm 16 kB 2010.08.24 12:35:30 findf1 - 775 rwx/rwx/rx 1L expertNoob adm 24 kB 2010.09.14 19:45:20 dir_info - 444 r--/r--/r-- 1L expertNoob adm 9.01 kB 2010.09.01 11:23:41 getopt.c - 664 rw-/rw-/r-- 1L expertNoob adm 6.86 kB 2010.09.01 11:24:47 getopt.o - 664 rw-/rw-/r-- 1L expertNoob adm 6.93 kB 2010.09.14 19:37:44 findf1.o l 775 rwx/rwx/rx 1L expertNoob adm 6 B 2010.10.06 17:09:01 test1 -> test.c - 664 rw-/rw-/r-- 1L expertNoob adm 534 B 2009.03.26 15:34:23 > test.c d 755 rwx/rx/rx 25L expertNoob adm 8 kB 2009.05.20 15:36:23 zip30/
这里是 :
#include <sys/types.h> #include <sys/stat.h> #include <sys/errno.h> #include <dirent.h> #include <pwd.h> #include <grp.h> #include <time.h> #include <locale.h> #include <langinfo.h> #include <stdio.h> //#include <stdint.h> #include <limits.h> // PATH_MAX #include <stdarg.h> #include "getopt.h" static short START_VSNBUFF=16; // This is bformat from Better String library (bstrlib), customized int strformat (char ** str, const char * fmt, ...) { va_list arglist; char * buff; int n, r; /* Since the length is not determinable beforehand, a search is performed using the truncating "vsnprintf" call (to avoid buffer overflows) on increasing potential sizes for the output result. */ if ((n = (int) (2*strlen (fmt))) < START_VSNBUFF) n = START_VSNBUFF; if ( NULL == ( buff = (char *) malloc((n + 2)*sizeof(char)) ) ) { n = 1; if ( NULL == ( buff = (char *) malloc((n + 2)*sizeof(char)) ) ) { fprintf( stderr, "strformat: not enough memory to format string\n" ); return -1; } } for (;;) { va_start (arglist, fmt); r = vsnprintf (buff, n + 1, fmt, arglist); // n+1 chars: buff[0]..buff[n], n chars from arglist: buff[n]='\0' va_end (arglist); buff[n] = (unsigned char) '\0'; // doesn't hurt, especially strlen! if ( strlen(buff) < n ) break; if (r > n) n = r; else n += n; if ( NULL == ( buff = (char *) realloc( buff, (n + 2)*sizeof(char) ) ) ) { free(buff); fprintf( stderr, "strformat: not enough memory to format string\n" ); return -1; } } if( NULL != *str ) free(*str); *str = buff; return 0; } int printFSObjectInfo( const char * path, const char * name ) { struct stat statbuf; struct passwd *pwd; struct group *grp; struct tm *tm; char datestring[256]; char *type = "? "; char *fbuf = NULL; double size = 0; const char *units[] = {"B ", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"}; int i = 0; char owner[] = "---", group[] = "---", others[] = "---"; /* Get entry's information. */ if ( -1 == lstat( path, &statbuf ) ) { fprintf( stderr, "printFSObjectInfo: error: can't stat %s\n", path ); if( 0 == strformat( &fbuf, "lstat() said: %s", path ) ) { perror(fbuf); return -1; } } // File type if( S_ISREG(statbuf.st_mode) ) type = "-"; // regular file if( S_ISDIR(statbuf.st_mode) ) { // directory type="d"; if( S_ISCDF(statbuf.st_mode) ) type = "hd"; // hidden dir } if( S_ISBLK(statbuf.st_mode) ) type = "b"; // block special if( S_ISCHR(statbuf.st_mode) ) type = "c"; // character special if( S_ISFIFO(statbuf.st_mode) ) type = "f"; // pipe or FIFO if( S_ISLNK(statbuf.st_mode) ) type = "l"; // symbolic link if( S_ISSOCK(statbuf.st_mode) ) type = "s"; // socket if( S_ISNWK(statbuf.st_mode) ) type = "n"; // network special printf( "%2s ", type ); /* Print out type, permissions, and number of links. */ //printf("%10.10s", sperm (statbuf.st_mode)); if( S_IRUSR & statbuf.st_mode ) owner[0] = 'r'; if( S_IWUSR & statbuf.st_mode ) owner[1] = 'w'; if( S_IXUSR & statbuf.st_mode ) owner[2] = 'x'; if( S_IRGRP & statbuf.st_mode ) group[0] = 'r'; if( S_IWGRP & statbuf.st_mode ) group[1] = 'w'; if( S_IXGRP & statbuf.st_mode ) group[2] = 'x'; if( S_IROTH & statbuf.st_mode ) others[0] = 'r'; if( S_IWOTH & statbuf.st_mode ) others[1] = 'w'; if( S_IXOTH & statbuf.st_mode ) others[2] = 'x'; //printf( "\n%o\n", statbuf.st_mode ); printf( "%3o %s/%s/%s ", 0777 & statbuf.st_mode, owner, group, others ); printf("%4dL", statbuf.st_nlink); /* Print out owner's name if it is found using getpwuid(). */ if ((pwd = getpwuid(statbuf.st_uid)) != NULL) printf(" %-8.8s", pwd->pw_name); else printf(" %-8d", statbuf.st_uid); /* Print out group name if it is found using getgrgid(). */ if ((grp = getgrgid(statbuf.st_gid)) != NULL) printf(" %-8.8s", grp->gr_name); else printf(" %-8d", statbuf.st_gid); /* Print size of file. */ //printf(" %9d", (int)statbuf.st_size); i = 0; size = (double) statbuf.st_size; while (size >= 1024) { size /= 1024; i++; } if( 0 == (double)(size - (long) size) ) printf( "%7d %-2s", (long)size, units[i] ); else printf( "%7.2f %-2s", size, units[i] ); tm = localtime(&statbuf.st_mtime); /* Get localized date string. */ strftime(datestring, sizeof(datestring), "%Y.%m.%d %T", tm); // nl_langinfo(D_T_FMT) if ( 0 == strcmp(name, "\n") ) printf(" %s > %s", datestring, path); else { if( 0 == strcmp(type, "d") ) printf(" %s %s/", datestring, name); else printf(" %s %s", datestring, name); } if( 0 == strcmp(type, "l") ) { char buf[1+PATH_MAX]; if( -1 == readlink( path, buf, (1+PATH_MAX) ) ) { fprintf( stderr, "printFSObjectInfo: error: can't read symbolic link %s\n", path); if( 0 == strformat( &fbuf, "readlink() said: %s:", path ) ) { perror(fbuf); return -2; } } else { lstat( buf, &statbuf ); // want errno, a symlink may point to non-existing object if(errno == ENOENT) printf(" -> %s [!no such file!]\n", buf ); else { printf(" -> %s\n", buf ); if ( 0 != strcmp(name, "\n") ) printFSObjectInfo( buf, "\n" ); } } } else printf("\n"); return 0; } int main(int argc, char **argv) { struct dirent *dp; struct stat statbuf; char *path = NULL; //[1+PATH_MAX]; char *fbuf = NULL; char *pathArg = NULL; if( argc == 1 || 0 == strlen(argv[1]) ) pathArg = "."; else pathArg = argv[1]; if ( lstat( pathArg, &statbuf ) == -1 ) { printf("%s: error: can't stat %s\n", argv[0], pathArg); if( 0 == strformat( &fbuf, "stat() said: %s", pathArg ) ) perror(fbuf); exit(2); } if( S_ISDIR(statbuf.st_mode) ) { DIR *dir = opendir( pathArg ); if( NULL == dir ) { fprintf( stderr, "%s: error: can't open %s\n", argv[0], pathArg ); if( 0 != strformat( &fbuf, "opendir() said: %s", pathArg ) ) exit(5); perror(fbuf); exit(4); } /* Loop through directory entries. */ while ( (dp = readdir(dir)) != NULL ) { if( 0!= strformat( &path, "%s/%s", pathArg, dp->d_name ) ) continue; printFSObjectInfo( path, dp->d_name ); } closedir(dir); } else printFSObjectInfo( pathArg, pathArg ); return 0; }
在printFSObjectInfo()中,您有完整的lstat()系统调用功能,您可以根据自己的意愿对其进行自定义。
好。
在Mac OS X上(在10.10.5优胜美地至10.12.4 Sierra上测试):
prompt> ls -lT total 0 -rw-r--r-- 1 youruser staff 0 Sep 24 10:28:30 2015 my_file_1.txt -rw-r--r-- 1 youruser staff 0 Sep 24 10:28:35 2015 my_file_2.txt
如果您正在使用HP-UX:
好吧,让我们说,文件的名称是“垃圾”。 在HP-UX上,您可以执行以下操作:
perl -e'@ d = localtime((stat(shift))[9]); printf“%4d-%02d-%02d%02d:%02d:%02d \ n”,$ d [5] + 1900,$ d [4] + 1,$ d [3],$ d [2], $ d [1],$ d [0]'垃圾
是的,perl自带了HP-UX。 它在/ usr / contrib中。 但是在/ usr / local或/ opt中可能有更新的版本。
来源: Perderabo
今天,我在旧版本的HP-UX上遇到了同样的问题。 统计程序不是安装的一部分。 (只是C版)
对我来说,最快捷的解决方案是使用我的笔记本电脑上运行的Tectia文件传输工具,而无需进行任何复制,它会将HP-UX的上次修改时间转换为一次,并为所有文件提供日期和时间登录到UNIX。
可能这与其他类似的基于图形的文件传输工具,但我还没有尝试过。
在AIX上,istat命令执行以下操作:
machine:~/support> istat ../core Inode 30034 on device 32/3 File Protection: rw-rw-r-- Owner: 500(group) Group: 500(user) Link count: 1 Length 10787748 bytes Last updated: Wed Feb 22 13:54:28 2012 Last modified: Wed Feb 22 13:54:28 2012 Last accessed: Wed Feb 22 19:58:10 2012
如果你只需要HH:MM:SS, ls -le就可以工作
尝试perl单行:
perl -e '@d=localtime ((stat(shift))[9]); printf "%02d-%02d-%04d %02d:%02d:%02d\n", $d[3],$d[4]+1,$d[5]+1900,$d[2],$d[1],$d[0]' your_file_to_show_the_date_for.your_extension