📄 ch09_13.htm
字号:
<HTML><HEAD><TITLE>Recipe 9.12. Program: lst (Perl Cookbook)</TITLE><METANAME="DC.title"CONTENT="Perl Cookbook"><METANAME="DC.creator"CONTENT="Tom Christiansen & Nathan Torkington"><METANAME="DC.publisher"CONTENT="O'Reilly & Associates, Inc."><METANAME="DC.date"CONTENT="1999-07-02T01:39:23Z"><METANAME="DC.type"CONTENT="Text.Monograph"><METANAME="DC.format"CONTENT="text/html"SCHEME="MIME"><METANAME="DC.source"CONTENT="1-56592-243-3"SCHEME="ISBN"><METANAME="DC.language"CONTENT="en-US"><METANAME="generator"CONTENT="Jade 1.1/O'Reilly DocBook 3.0 to HTML 4.0"><LINKREV="made"HREF="mailto:online-books@oreilly.com"TITLE="Online Books Comments"><LINKREL="up"HREF="ch09_01.htm"TITLE="9. Directories"><LINKREL="prev"HREF="ch09_12.htm"TITLE="9.11. Program: symirror"><LINKREL="next"HREF="ch10_01.htm"TITLE="10. Subroutines"></HEAD><BODYBGCOLOR="#FFFFFF"><img alt="Book Home" border="0" src="gifs/smbanner.gif" usemap="#banner-map" /><map name="banner-map"><area shape="rect" coords="1,-2,616,66" href="index.htm" alt="Perl Cookbook"><area shape="rect" coords="629,-11,726,25" href="jobjects/fsearch.htm" alt="Search this book" /></map><div class="navbar"><p><TABLEWIDTH="684"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch09_12.htm"TITLE="9.11. Program: symirror"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 9.11. Program: symirror"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><B><FONTFACE="ARIEL,HELVETICA,HELV,SANSERIF"SIZE="-1"><ACLASS="chapter"REL="up"HREF="ch09_01.htm"TITLE="9. Directories"></A></FONT></B></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="chapter"HREF="ch10_01.htm"TITLE="10. Subroutines"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 10. Subroutines"BORDER="0"></A></TD></TR></TABLE></DIV><DIVCLASS="sect1"><H2CLASS="sect1"><ACLASS="title"NAME="ch09-chap09_program_1">9.12. Program: lst</A></H2><PCLASS="para"><ACLASS="indexterm"NAME="ch09-idx-1000004453-0"></A><ACLASS="indexterm"NAME="ch09-idx-1000004453-1"></A><ACLASS="indexterm"NAME="ch09-idx-1000004453-2"></A><ACLASS="indexterm"NAME="ch09-idx-1000004453-3"></A>Have you ever wondered what the newest or biggest files within a directory are? The standard <EMCLASS="emphasis">ls</EM> program has options for listing out directories sorted in time order (the <BCLASS="emphasis.bold">-t</B> flag) and for recursing into subdirectories (the <BCLASS="emphasis.bold">-R</B> flag). However, it pauses at each directory to display the sorted contents of just that directory. It doesn't descend through all the subdirectories first and then sort everything it finds.</P><PCLASS="para">The following <EMCLASS="emphasis">lst</EM> program does that. Here's an example using its <BCLASS="emphasis.bold">-l</B> flag to get a long listing:</P><PRECLASS="programlisting">% lst -l /etc<CODECLASS="userinput"><B><CODECLASS="replaceable"><I>12695 0600 1 root wheel 512 Fri May 29 10:42:41 1998 </I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I> /etc/ssh_random_seed</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>12640 0644 1 root wheel 10104 Mon May 25 7:39:19 1998 </I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I> /etc/ld.so.cache</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>12626 0664 1 root wheel 12288 Sun May 24 19:23:08 1998 </I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I> /etc/psdevtab</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>12304 0644 1 root root 237 Sun May 24 13:59:33 1998 </I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I> /etc/exports</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>12309 0644 1 root root 3386 Sun May 24 13:24:33 1998 </I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I> /etc/inetd.conf</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>12399 0644 1 root root 30205 Sun May 24 10:08:37 1998 </I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I> /etc/sendmail.cf</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>18774 0644 1 gnat perldoc 2199 Sun May 24 9:35:57 1998 </I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I> /etc/X11/XMetroconfig</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>12636 0644 1 root wheel 290 Sun May 24 9:05:40 1998 </I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I> /etc/mtab</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>12627 0640 1 root root 0 Sun May 24 8:24:31 1998 </I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I> /etc/wtmplock</I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I>12310 0644 1 root tchrist 65 Sun May 24 8:23:04 1998 </I></CODE></B></CODE><CODECLASS="userinput"><B><CODECLASS="replaceable"><I> /etc/issue</I></CODE></B></CODE>....</PRE><PCLASS="para"><EMCLASS="emphasis">/etc/X11/XMetroconfig</EM> showed up in the middle of the listing for <EMCLASS="emphasis">/etc</EM> because it wasn't just for <EMCLASS="emphasis">/etc</EM>, but for everything within that directory, recursively.</P><PCLASS="para">Other supported options include sorting on read time instead of write time using <BCLASS="emphasis.bold">-u</B> and sorting on size rather than time with <BCLASS="emphasis.bold">-s</B>. The <BCLASS="emphasis.bold">-i</B> flag takes the list of filenames from standard input instead of recursing with <CODECLASS="literal">find</CODE>. That way, if you already had a list of filenames, you could feed them to <EMCLASS="emphasis">lst</EM> for sorting.</P><PCLASS="para">The program is shown in <ACLASS="xref"HREF="ch09_13.htm#ch09-16966"TITLE="lst">Example 9.7</A>.</P><DIVCLASS="example"><H4CLASS="example"><ACLASS="title"NAME="ch09-16966">Example 9.7: lst</A></H4><PRECLASS="programlisting">#!/usr/bin/perl# lst - list sorted directory contents (depth first)use Getopt::Std;use File::Find;use File::stat;use User::pwent;use User::grent;getopts('lusrcmi') or die <<DEATH;Usage: $0 [-mucsril] [dirs ...] or $0 -i [-mucsrl] < filelistInput format: -i read pathnames from stdinOutput format: -l long listingSort on: -m use mtime (modify time) [DEFAULT] -u use atime (access time) -c use ctime (inode change time) -s use size for sortingOrdering: -r reverse sortNB: You may only use select one sorting option at a time.DEATH unless ($opt_i || @ARGV) { @ARGV = ('.') }if ($opt_c + $opt_u + $opt_s + $opt_m > 1) { die "can only sort on one time or size";}$IDX = 'mtime';$IDX = 'atime' if $opt_u;$IDX = 'ctime' if $opt_c;$IDX = 'size' if $opt_s;$TIME_IDX = $opt_s ? 'mtime' : $IDX;*name = *File::Find::name; # forcibly import that variable# the $opt_i flag tricks wanted into taking# its filenames from ARGV instead of being# called from find.if ($opt_i) { *name = *_; # $name now alias for $_ while (<>) { chomp; &wanted; } # ok, not stdin really} else { find(\&wanted, @ARGV);}# sort the files by their cached times, youngest first@skeys = sort { $time{$b} <=> $time{$a} } keys %time;# but flip the order if -r was supplied on command line@skeys = reverse @skeys if $opt_r;for (@skeys) { unless ($opt_l) { # emulate ls -l, except for permissions print "$_\n"; next; } $now = localtime $stat{$_}->$TIME_IDX(); printf "%6d %04o %6d %8s %8s %8d %s %s\n", $stat{$_}->ino(), $stat{$_}->mode() & 07777, $stat{$_}->nlink(), user($stat{$_}->uid()), group($stat{$_}->gid()), $stat{$_}->size(), $now, $_;}# get stat info on the file, saving the desired# sort criterion (mtime, atime, ctime, or size)# in the %time hash indexed by filename.# if they want a long list, we have to save the# entire stat object in %stat. yes, this is a# hash of objectssub wanted { my $sb = stat($_); # XXX: should be stat or lstat? return unless $sb; $time{$name} = $sb->$IDX(); # indirect method call $stat{$name} = $sb if $opt_l;}# cache user number to name conversionssub user { my $uid = shift; $user{$uid} = getpwuid($uid)->name || "#$uid" unless defined $user{$uid}; return $user{$uid};}# cache group number to name conversionssub group { my $gid = shift; $group{$gid} = getgrgid($gid)->name || "#$gid" unless defined $group{$gid}; return $group{$gid};<ACLASS="indexterm"NAME="ch09-idx-1000004455-0"></A><ACLASS="indexterm"NAME="ch09-idx-1000004455-1"></A><ACLASS="indexterm"NAME="ch09-idx-1000004455-2"></A><ACLASS="indexterm"NAME="ch09-idx-1000004455-3"></A>}<ACLASS="indexterm"NAME="ch09-idx-1000004337-0"></A></PRE></DIV></DIV><DIVCLASS="htmlnav"><P></P><HRALIGN="LEFT"WIDTH="684"TITLE="footer"><TABLEWIDTH="684"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch09_12.htm"TITLE="9.11. Program: symirror"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 9.11. Program: symirror"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><ACLASS="book"HREF="index.htm"TITLE="Perl Cookbook"><IMGSRC="../gifs/txthome.gif"ALT="Perl Cookbook"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="chapter"HREF="ch10_01.htm"TITLE="10. Subroutines"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 10. Subroutines"BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228">9.11. Program: symirror</TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><ACLASS="index"HREF="index/index.htm"TITLE="Book Index"><IMGSRC="../gifs/index.gif"ALT="Book Index"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228">10. Subroutines</TD></TR></TABLE><HRALIGN="LEFT"WIDTH="684"TITLE="footer"><FONTSIZE="-1"></DIV<!-- LIBRARY NAV BAR --> <img src="../gifs/smnavbar.gif" usemap="#library-map" border="0" alt="Library Navigation Links"><p> <a href="copyrght.htm">Copyright © 2002</a> O'Reilly & Associates. All rights reserved.</font> </p> <map name="library-map"> <area shape="rect" coords="1,0,85,94" href="../index.htm"><area shape="rect" coords="86,1,178,103" href="../lwp/index.htm"><area shape="rect" coords="180,0,265,103" href="../lperl/index.htm"><area shape="rect" coords="267,0,353,105" href="../perlnut/index.htm"><area shape="rect" coords="354,1,446,115" href="../prog/index.htm"><area shape="rect" coords="448,0,526,132" href="../tk/index.htm"><area shape="rect" coords="528,1,615,119" href="../cookbook/index.htm"><area shape="rect" coords="617,0,690,135" href="../pxml/index.htm"></map> </BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -