📄 ch17_19.htm
字号:
<HTML><!--Distributed by F --><HEAD><TITLE>[Chapter 17] 17.19 Finding Files (Much) Faster with a find Database </TITLE><METANAME="DC.title"CONTENT="UNIX Power Tools"><METANAME="DC.creator"CONTENT="Jerry Peek, Tim O'Reilly & Mike Loukides"><METANAME="DC.publisher"CONTENT="O'Reilly & Associates, Inc."><METANAME="DC.date"CONTENT="1998-08-04T21:38:35Z"><METANAME="DC.type"CONTENT="Text.Monograph"><METANAME="DC.format"CONTENT="text/html"SCHEME="MIME"><METANAME="DC.source"CONTENT="1-56592-260-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="ch17_01.htm"TITLE="17. Finding Files with find"><LINKREL="prev"HREF="ch17_18.htm"TITLE='17.18 Using "Fast find"'><LINKREL="next"HREF="ch17_20.htm"TITLE="17.20 grepping a Directory Tree (and a Gotcha) "></HEAD><BODYBGCOLOR="#FFFFFF"TEXT="#000000"><DIVCLASS="htmlnav"><H1><IMGSRC="gifs/smbanner.gif"ALT="UNIX Power Tools"USEMAP="#srchmap"BORDER="0"></H1><MAPNAME="srchmap"><AREASHAPE="RECT"COORDS="0,0,466,58"HREF="index.htm"ALT="UNIX Power Tools"><AREASHAPE="RECT"COORDS="467,0,514,18"HREF="jobjects/fsearch.htm"ALT="Search this book"></MAP><TABLEWIDTH="515"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="172"><ACLASS="SECT1"HREF="ch17_18.htm"TITLE='17.18 Using "Fast find"'><IMGSRC="gifs/txtpreva.gif"SRC="gifs/txtpreva.gif"ALT='Previous: 17.18 Using "Fast find"'BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="171"><B><FONTFACE="ARIEL,HELVETICA,HELV,SANSERIF"SIZE="-1">Chapter 17<BR>Finding Files with find</FONT></B></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="172"><ACLASS="SECT1"HREF="ch17_20.htm"TITLE="17.20 grepping a Directory Tree (and a Gotcha) "><IMGSRC="gifs/txtnexta.gif"SRC="gifs/txtnexta.gif"ALT="Next: 17.20 grepping a Directory Tree (and a Gotcha) "BORDER="0"></A></TD></TR></TABLE> <HRALIGN="LEFT"WIDTH="515"TITLE="footer"></DIV><DIVCLASS="SECT1"><H2CLASS="sect1"><ACLASS="title"NAME="UPT-ART-1640">17.19 Finding Files (Much) Faster with a find Database </A></H2><PCLASS="para"><ACLASS="indexterm"NAME="UPT-ART-1640-IX-SEARCHING-IN-DATABASES--DATABASES"></A><ACLASS="indexterm"NAME="UPT-ART-1640-IX-DATABASES-SEARCHING"></A><ACLASS="indexterm"NAME="UPT-ART-1640-IX-FAST-FIND-WITH-DATABASE--DATABASE"></A>If you use<SPANCLASS="link"><EMCLASS="emphasis">find</EM> (<ACLASS="linkend"HREF="ch17_02.htm"TITLE="Delving Through a Deep Directory Tree ">17.2</A>)</SPAN>to search for files, you know that it can take a longtime to work, especially when there are lots of directories to search.Here are some ideas for speeding up your <EMCLASS="emphasis">find</EM>s.</P><BLOCKQUOTECLASS="note"><PCLASS="para"><STRONG>NOTE:</STRONG> By design, setups like these that build a file database won't have absolutelyup-to-date information about all your files.</P></BLOCKQUOTE><PCLASS="para">If your system has<SPANCLASS="link">"fast <EMCLASS="emphasis">find</EM>" or GNU <EMCLASS="emphasis">locate</EM> (<ACLASS="linkend"HREF="ch17_18.htm"TITLE='Using "Fast find"'>17.18</A>)</SPAN>,that's probably all you need.It lets you search a list of all pathnames on the system.</P><PCLASS="para">Even if you have the fast <EMCLASS="emphasis">find</EM> or <EMCLASS="emphasis">locate</EM>,it still might not do what you need.For example, those utilties only search for pathnames.To find files by the owner's name, the number of links, the size, and so on,you have to use "slow" <EMCLASS="emphasis">find</EM>.In that case - or, when you don't have fast <EMCLASS="emphasis">find</EM> or <EMCLASS="emphasis">locate</EM> - youmay want to set up your own version.</P><PCLASS="para">The basic fast <EMCLASS="emphasis">find</EM> has two parts.<ACLASS="indexterm"NAME="AUTOID-19552"></A>One part is a command, a shell script named <EMCLASS="emphasis">/usr/lib/find/updatedb</EM>, thatbuilds a database of the files on your system - if your system has it, take alook to see a fancy way to build the database.The other part is the <EMCLASS="emphasis">find</EM> command itself - it searches the database forpathnames that match the name (regular expression) you type.</P><PCLASS="para">To make your own fast <EMCLASS="emphasis">find</EM>:</P><OLCLASS="orderedlist"><LICLASS="listitem"><PCLASS="para">Pick a filename for the database.We'll use <EMCLASS="emphasis">$HOME/.fastfind</EM> (some systems use <CODECLASS="literal">$LOGDIR</CODE> instead of<CODECLASS="literal">$HOME</CODE>).</P></LI><LICLASS="listitem"><PCLASS="para">Design the <EMCLASS="emphasis">find</EM> command you want to use.The command to build a database of all the files in your home directorymight look like this:</P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">cdfind . -print | sed "s@^./@@" > $HOME/.fastfind</PRE></BLOCKQUOTE></P><PCLASS="para"> If you're short on disk space, use this instead:</P><PCLASS="para"><TABLECLASS="screen.co"BORDER="1"><TR><THVALIGN="TOP"><PRECLASS="calloutlist"> <ACLASS="co"HREF="ch24_07.htm"TITLE="24.7 Compressing Files to Save Space ">gzip</A> </PRE></TH><TDVALIGN="TOP"><PRECLASS="screen">cdfind . -print | sed "s@^./@@" | gzip > $HOME/.fastfind.gz</PRE></TD></TR></TABLE></P><PCLASS="para">To save disk space, the script starts from your home directory, then uses<SPANCLASS="link"><EMCLASS="emphasis">sed</EM> (<ACLASS="linkend"HREF="ch34_24.htm"TITLE="Quick Reference: sed ">34.24</A>)</SPAN>to strip the start of the pathname (like <CODECLASS="literal">./</CODE>)from every entry.(If you're building a database of the whole filesystem, don't do that!)</P></LI><LICLASS="listitem"><PCLASS="para">Set up<SPANCLASS="link"><EMCLASS="emphasis">cron</EM> (<ACLASS="linkend"HREF="ch40_12.htm"TITLE="Periodic Program Execution: The cron Facility ">40.12</A>)</SPAN>or<SPANCLASS="link"><EMCLASS="emphasis">at</EM> (<ACLASS="linkend"HREF="ch40_03.htm"TITLE="The at Command ">40.3</A>)</SPAN>to run that <EMCLASS="emphasis">find</EM> as often as you want - usually once early everymorning is fine.</P></LI><LICLASS="listitem"><PCLASS="para">Finally, make a<SPANCLASS="link">shell script (<ACLASS="linkend"HREF="ch01_05.htm"TITLE="Anyone Can Program the Shell ">1.5</A>)</SPAN>(I call mine <EMCLASS="emphasis">ffind</EM>) to search thedatabase.It's usually fastest to use<SPANCLASS="link"><EMCLASS="emphasis">egrep</EM> (<ACLASS="linkend"HREF="ch27_05.htm"TITLE="Extended Searching for Text with egrep ">27.5</A>)</SPAN>-and that lets you search with flexible<SPANCLASS="link">regular expressions (<ACLASS="linkend"HREF="ch26_04.htm"TITLE="Using Metacharacters in Regular Expressions ">26.4</A>)</SPAN>,too:</P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">egrep "$1" $HOME/.fastfind | sed "s@^@$HOME/@"</PRE></BLOCKQUOTE></P><PCLASS="para">or, for a <EMCLASS="emphasis">gzip</EM>ped database:</P><PCLASS="para"><TABLECLASS="screen.co"BORDER="1"><TR><THVALIGN="TOP"><PRECLASS="calloutlist"><ACLASS="co"HREF="ch24_07.htm"TITLE="24.7 Compressing Files to Save Space ">gzcat</A> </PRE></TH><TDVALIGN="TOP"><PRECLASS="screen">gzcat $HOME/.fastfind.gz | egrep "$1" | sed "s@^@$HOME/@"</PRE></TD></TR></TABLE></P><PCLASS="para">The <EMCLASS="emphasis">sed</EM> expressions add your home directory's pathname (like<EMCLASS="emphasis">/usr/freddie</EM>) to each line.</P></LI></OL><PCLASS="para">To search the database, type:</P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">% <CODECLASS="userinput"><B>ffind somefile</B></CODE>/usr/freddie/lib/somefile% <CODECLASS="userinput"><B>ffind '/(sep|oct)[^/]*$'</B></CODE>/usr/freddie/misc/project/september/usr/freddie/misc/project/october</PRE></BLOCKQUOTE></P><PCLASS="para">You can do much more.I'll get you started.If you have room to store more information than just pathnames, you canfeed your <EMCLASS="emphasis">find</EM> output to a command like <EMCLASS="emphasis">ls -l</EM> or<SPANCLASS="link"><EMCLASS="emphasis">sls</EM> (<ACLASS="linkend"HREF="ch16_29.htm"TITLE="sls: Super ls with Format You Can Choose ">16.29</A>)</SPAN>.For example, if you do a lot of work with<SPANCLASS="link">links (<ACLASS="linkend"HREF="ch18_03.htm"TITLE="Files with Two or More Names">18.3</A>)</SPAN>,you might want to keep the files'<SPANCLASS="link">i-numbers (<ACLASS="linkend"HREF="ch01_22.htm"TITLE="How UNIX Keeps Track of Files: Inodes ">1.22</A>)</SPAN>as well as their names.You'd build your database with a command like the one below.Use <SPANCLASS="link"><EMCLASS="emphasis">xargs</EM> (<ACLASS="linkend"HREF="ch09_21.htm"TITLE="Handle Too-Long Command Lines with xargs ">9.21</A>)</SPAN>or<SPANCLASS="link">something like it (<ACLASS="linkend"HREF="ch09_20.htm"TITLE="Too Many Files for the Command Line ">9.20</A>)</SPAN>. </P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">cdfind . -print | xargs ls -id > $HOME/.fastfind</PRE></BLOCKQUOTE></P><PCLASS="para">Or, if your version of <EMCLASS="emphasis">find</EM> has the handy <EMCLASS="emphasis">-ls</EM> operator, usethe next script.Watch out for really large i-numbers; they might shift the columns andmake<SPANCLASS="link"><EMCLASS="emphasis">cut</EM> (<ACLASS="linkend"HREF="ch35_14.htm"TITLE="Cutting Columns or Fields with cut ">35.14</A>)</SPAN>give wrong output.</P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">cdfind . -ls | cut -c1-7,67- > $HOME/.fastfind</PRE></BLOCKQUOTE></P><PCLASS="para">The exact column numbers will depend on your system.Then, your <EMCLASS="emphasis">ffind</EM> script could search for files by i-number.For instance, if you had a file with i-number 1234 and you wanted to find allits links:</P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">% <CODECLASS="userinput"><B>ffind "^1234 "</B></CODE></PRE></BLOCKQUOTE></P><PCLASS="para">(The space at the end prevents matches with i-numbers like 12345.)You could also search by pathname.</P><PCLASS="para">Article<ACLASS="xref"HREF="ch16_21.htm"TITLE="Finding All Directories with the Same Name ">16.21</A>shows another <EMCLASS="emphasis">find</EM> database setup, a list of directories or fileswith the same names.</P><PCLASS="para">With some information about UNIX shell programming and utilities like<SPANCLASS="link"><EMCLASS="emphasis">awk</EM> (<ACLASS="linkend"HREF="ch33_11.htm"TITLE="Quick Reference: awk ">33.11</A>)</SPAN>,the techniques in this articleshould let you build and search a sophisticated file database - and getinformation much faster than with plain old <EMCLASS="emphasis">find</EM>.<ACLASS="indexterm"NAME="AUTOID-19638"></A><ACLASS="indexterm"NAME="AUTOID-19639"></A><ACLASS="indexterm"NAME="AUTOID-19640"></A></P><DIVCLASS="sect1info"><PCLASS="SECT1INFO">- <SPANCLASS="authorinitials">JP</SPAN></P></DIV></DIV><DIVCLASS="htmlnav"><P></P><HRALIGN="LEFT"WIDTH="515"TITLE="footer"><TABLEWIDTH="515"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="172"><ACLASS="SECT1"HREF="ch17_18.htm"TITLE='17.18 Using "Fast find"'><IMGSRC="gifs/txtpreva.gif"SRC="gifs/txtpreva.gif"ALT='Previous: 17.18 Using "Fast find"'BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="171"><ACLASS="book"HREF="index.htm"TITLE="UNIX Power Tools"><IMGSRC="gifs/txthome.gif"SRC="gifs/txthome.gif"ALT="UNIX Power Tools"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="172"><ACLASS="SECT1"HREF="ch17_20.htm"TITLE="17.20 grepping a Directory Tree (and a Gotcha) "><IMGSRC="gifs/txtnexta.gif"SRC="gifs/txtnexta.gif"ALT="Next: 17.20 grepping a Directory Tree (and a Gotcha) "BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="172">17.18 Using "Fast find"</TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="171"><ACLASS="index"HREF="index/idx_0.htm"TITLE="Book Index"><IMGSRC="gifs/index.gif"SRC="gifs/index.gif"ALT="Book Index"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="172">17.20 grepping a Directory Tree (and a Gotcha) </TD></TR></TABLE><HRALIGN="LEFT"WIDTH="515"TITLE="footer"><IMGSRC="gifs/smnavbar.gif"SRC="gifs/smnavbar.gif"USEMAP="#map"BORDER="0"ALT="The UNIX CD Bookshelf Navigation"><MAPNAME="map"><AREASHAPE="RECT"COORDS="0,0,73,21"HREF="../index.htm"ALT="The UNIX CD Bookshelf"><AREASHAPE="RECT"COORDS="74,0,163,21"HREF="index.htm"ALT="UNIX Power Tools"><AREASHAPE="RECT"COORDS="164,0,257,21"HREF="../unixnut/index.htm"ALT="UNIX in a Nutshell"><AREASHAPE="RECT"COORDS="258,0,321,21"HREF="../vi/index.htm"ALT="Learning the vi Editor"><AREASHAPE="RECT"COORDS="322,0,378,21"HREF="../sedawk/index.htm"ALT="sed & awk"><AREASHAPE="RECT"COORDS="379,0,438,21"HREF="../ksh/index.htm"ALT="Learning the Korn Shell"><AREASHAPE="RECT"COORDS="439,0,514,21"HREF="../lrnunix/index.htm"ALT="Learning the UNIX Operating System"></MAP></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -