?? ch25_08.htm
字號:
<HTML><!--Distributed by F --><HEAD><TITLE>[Chapter 25] 25.8 Finding File Types </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:43:15Z"><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="ch25_01.htm"TITLE="25. Showing What's in a File"><LINKREL="prev"HREF="ch25_07.htm"TITLE="25.7 Show Non-Printing Characters with cat -v or od -c "><LINKREL="next"HREF="ch25_09.htm"TITLE="25.9 Adding and Deleting White Space "></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="ch25_07.htm"TITLE="25.7 Show Non-Printing Characters with cat -v or od -c "><IMGSRC="gifs/txtpreva.gif"SRC="gifs/txtpreva.gif"ALT="Previous: 25.7 Show Non-Printing Characters with cat -v or od -c "BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="171"><B><FONTFACE="ARIEL,HELVETICA,HELV,SANSERIF"SIZE="-1">Chapter 25<BR>Showing What's in a File</FONT></B></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="172"><ACLASS="SECT1"HREF="ch25_09.htm"TITLE="25.9 Adding and Deleting White Space "><IMGSRC="gifs/txtnexta.gif"SRC="gifs/txtnexta.gif"ALT="Next: 25.9 Adding and Deleting White Space "BORDER="0"></A></TD></TR></TABLE> <HRALIGN="LEFT"WIDTH="515"TITLE="footer"></DIV><DIVCLASS="SECT1"><H2CLASS="sect1"><ACLASS="title"NAME="UPT-ART-2650">25.8 Finding File Types </A></H2><PCLASS="para">Many different kinds of files live on the typical UNIX system:database files, executable files, regular text files, files for fancyeditors like Interleaf, <EMCLASS="emphasis">tar</EM> files, mail messages,directories, font files, and so on.<ACLASS="indexterm"NAME="AUTOID-27642"></A><ACLASS="indexterm"NAME="AUTOID-27645"></A></P><PCLASS="para">You often want to check to make sure you have the right "kind" of filebefore doing something. For example, you'd like to read the file<EMCLASS="emphasis">tar</EM>. But before typing <CODECLASS="literal">more tar</CODE>, you'd like to knowwhether this file is your set of notes on carbon-based sludge, or the <EMCLASS="emphasis">tar</EM> executable. If you're wrong,the consequences might be unpleasant. Sending the <EMCLASS="emphasis">tar</EM> executable toyour screen might <SPANCLASS="link">screw up your terminal settings (<ACLASS="linkend"HREF="ch42_04.htm"TITLE="Checklist for Resetting a Messed Up Terminal ">42.4</A>)</SPAN>,log you off, or do any number of hostile things.</P><PCLASS="para">The <EMCLASS="emphasis">file</EM> utility tells you what sort of file something is.[2]It's fairly self-explanatory:</P><BLOCKQUOTECLASS="footnote"><PCLASS="para">[2] Another solution to this problem is <SPANCLASS="link"><EMCLASS="emphasis">findtext</EM> (<ACLASS="linkend"HREF="ch16_26.htm"TITLE="Finding Text Files with findtext ">16.26</A>)</SPAN>.</P></BLOCKQUOTE><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">% <CODECLASS="userinput"><B>file /bin/sh</B></CODE>/bin/sh: sparc demand paged executable% <CODECLASS="userinput"><B>file 2650</B></CODE>2650: [nt]roff, tbl, or eqn input text% <CODECLASS="userinput"><B>file 0001,v</B></CODE>0001,v: ascii text% <CODECLASS="userinput"><B>file foo.sh</B></CODE>foo.sh: shell commands</PRE></BLOCKQUOTE></P><PCLASS="para"><EMCLASS="emphasis">file</EM> is actually quite clever [though it isn't alwayscorrect - some versions are better than others<EMCLASS="emphasis"> - JP</EM> ].It doesn't just tell you ifsomething's binary or text; it looks at the beginning of the file andtries to figure out what it's doing. So, for example, you see thatfile <EMCLASS="emphasis">2650</EM> is an<SPANCLASS="link"><EMCLASS="emphasis">nroff</EM> (<ACLASS="linkend"HREF="ch43_13.htm"TITLE="The Text Formatters nroff, troff, ditroff, ... ">43.13</A>)</SPAN>file and <EMCLASS="emphasis">foo.sh</EM> is a shellscript. It isn't quite clever enough to figure out that <EMCLASS="emphasis">0001,v</EM>is an<SPANCLASS="link">RCS (<ACLASS="linkend"HREF="ch20_14.htm"TITLE="RCS Basics ">20.14</A>)</SPAN>archive, but it does know that it's a plain<SPANCLASS="link">ASCII (<ACLASS="linkend"HREF="ch51_03.htm"TITLE="ASCII Characters: Listing and Getting Values ">51.3</A>)</SPAN>text file.</P><PCLASS="para">System V and SunOS let you customize the <EMCLASS="emphasis">file</EM> command so that itwill recognize additional file types. The file <EMCLASS="emphasis">/etc/magic</EM> tells<EMCLASS="emphasis">file</EM> how to recognize different kinds of files. It's capable ofa lot (and should be capable of even more), but we'll satisfyourselves with an introductory explanation. Our goal will be to teach<EMCLASS="emphasis">file</EM> to recognize RCS archives.</P><PCLASS="para"><EMCLASS="emphasis">/etc/magic</EM> has four fields:</P><BLOCKQUOTECLASS="blockquote"><PCLASS="para"><CODECLASS="replaceable"><I>offset data-type value file-type</I></CODE></P></BLOCKQUOTE><PCLASS="para">These are:</P><DLCLASS="variablelist"><DTCLASS="term"><CODECLASS="replaceable"><I>offset</I></CODE></DT><DDCLASS="listitem"><PCLASS="para">The offset into the file at which <EMCLASS="emphasis">magic</EM> will try to findsomething. If you're looking for something right at the beginning ofthe file, the offset should be <CODECLASS="literal">0</CODE>. (This is usually what youwant.)</P></DD><DTCLASS="term"><CODECLASS="replaceable"><I>data-type</I></CODE></DT><DDCLASS="listitem"><PCLASS="para">The type of test to make. Use <CODECLASS="literal">string</CODE> for text comparisons,<CODECLASS="literal">byte</CODE> for byte comparisons, <CODECLASS="literal">short</CODE> for two-bytecomparisons, and <CODECLASS="literal">long</CODE> for four-byte comparisons.</P></DD><DTCLASS="term"><CODECLASS="replaceable"><I>value</I></CODE></DT><DDCLASS="listitem"><PCLASS="para">The value you want to find. For string comparisons, any text stringwill do; you can use the standard UNIX escape sequences (like<CODECLASS="literal">\n</CODE> for newline). For numeric comparisons (byte, short, long),this field should be a number, expressed as a C constant (e.g.,<CODECLASS="literal">0x77</CODE> for the hexadecimal byte 77).</P></DD><DTCLASS="term"><CODECLASS="replaceable"><I>file-type</I></CODE></DT><DDCLASS="listitem"><PCLASS="para">The string that <EMCLASS="emphasis">file</EM> will print if this test succeeds.</P></DD></DL><PCLASS="para">So, we know that RCS archives begin with the word <CODECLASS="literal">head</CODE>.This word is right at the beginning of the file (offset 0). And weobviously want a string comparison. So we make the the followingaddition to <EMCLASS="emphasis">/etc/magic</EM>:</P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">0 string head RCS archive</PRE></BLOCKQUOTE></P><PCLASS="para">This says, "The file is an RCS archive if you find the string<CODECLASS="literal">head</CODE> at an offset of 0 bytes from the beginning of the file."Does it work?</P><PCLASS="para"><BLOCKQUOTECLASS="screen"><PRECLASS="screen">% <CODECLASS="userinput"><B>file RCS/0002,v</B></CODE>RCS/0002,v: RCS archive</PRE></BLOCKQUOTE></P><PCLASS="para"> As I said, the tests can be much more complicated, particularly ifyou're working with binary files. To recognize simple text files, this is all you need to know.</P><DIVCLASS="sect1info"><PCLASS="SECT1INFO">- <SPANCLASS="authorinitials">ML</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="ch25_07.htm"TITLE="25.7 Show Non-Printing Characters with cat -v or od -c "><IMGSRC="gifs/txtpreva.gif"SRC="gifs/txtpreva.gif"ALT="Previous: 25.7 Show Non-Printing Characters with cat -v or od -c "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="ch25_09.htm"TITLE="25.9 Adding and Deleting White Space "><IMGSRC="gifs/txtnexta.gif"SRC="gifs/txtnexta.gif"ALT="Next: 25.9 Adding and Deleting White Space "BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="172">25.7 Show Non-Printing Characters with cat -v or od -c </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">25.9 Adding and Deleting White Space </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 + -