⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch09_13.htm

📁 By Tom Christiansen and Nathan Torkington ISBN 1-56592-243-3 First Edition, published August 1998
💻 HTM
字号:
<HTML><HEAD><TITLE>Recipe 9.12. Program: lst (Perl Cookbook)</TITLE><METANAME="DC.title"CONTENT="Perl Cookbook"><METANAME="DC.creator"CONTENT="Tom Christiansen &amp; Nathan Torkington"><METANAME="DC.publisher"CONTENT="O'Reilly &amp; 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 &lt;&lt;DEATH;Usage: $0 [-mucsril] [dirs ...] or    $0 -i [-mucsrl] &lt; 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 &gt; 1) {    die &quot;can only sort on one time or size&quot;;}$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 (&lt;&gt;) { chomp; &amp;wanted; }   # ok, not stdin really}  else {    find(\&amp;wanted, @ARGV);}# sort the files by their cached times, youngest first@skeys = sort { $time{$b} &lt;=&gt; $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 &quot;$_\n&quot;;        next;    }    $now = localtime $stat{$_}-&gt;$TIME_IDX();    printf &quot;%6d %04o %6d %8s %8s %8d %s %s\n&quot;,        $stat{$_}-&gt;ino(),        $stat{$_}-&gt;mode() &amp; 07777,        $stat{$_}-&gt;nlink(),        user($stat{$_}-&gt;uid()),        group($stat{$_}-&gt;gid()),        $stat{$_}-&gt;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-&gt;$IDX();  # indirect method call    $stat{$name} = $sb if $opt_l;}# cache user number to name conversionssub user {    my $uid = shift;    $user{$uid} = getpwuid($uid)-&gt;name || &quot;#$uid&quot;        unless defined $user{$uid};    return $user{$uid};}# cache group number to name conversionssub group {    my $gid = shift;    $group{$gid} = getgrgid($gid)-&gt;name || &quot;#$gid&quot;        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 &copy; 2002</a> O'Reilly &amp; 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 + -