- 浏览: 160398 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
saintwe:
我现在有个论坛是:www.xxx.com/bbs 是PHP的开 ...
Apache VirtualHost的用法 -
liubang201010:
Jprobe最新版本下载:
http://www.innov ...
Jprobe 下载 -
liubang201010:
Jprobe最新版本 v8.3下载:
http://www.i ...
Jprobe 下载 -
cl1154781231:
native2ascii -reverse -encoding ...
中文编码转Unicode -
wmlJava:
java_2008_4_4 写道这么一个需求:同一台服务器上有 ...
Apache VirtualHost的用法
本文介绍如何使用find
命令浏览 UNIX® 文件系统中丰富的内容。find
命令是 UNIX 程序员的技能中功能最强大和最有用的命令之一。各种版本的 UNIX 都具有可以包含数以千计的不同类型文件的文件系统。有了如此之多的选择,要定位一个特定文件或文件集,将变得非常困难。而find
命令能通过许多方式,让这项任务变得更加轻松。
没有什么能比得上探索和发现新的人、地方、事物所带来的刺激。领域可能有所不同,但有些原则却是一样的。在这些原则中,有一条是记录下您的旅程,另一条则是了解和使用工具。
UNIX® 操作系统很像一片广阔的、未经标识的荒野。当您在这样的领域中旅行时,可以选择一些日后能够给您带来帮助的工具。find
命令便是这样一种工具。find
命令不仅能够简单地用来定位文件,正如本文将介绍的那样,它还可以自动地执行其他 UNIX 命令的序列,其中使用所查找到的文件名作为输入。
所有称职的操作系统都具有协助您查找相关内容的工具。与大多数工具不同的是,UNIX 中的 find
命令可以自动地对其查找到的文件执行许多操作。
图形用户界面 (GUI) 中的标准 find
工具允许您对所查找到的文件进行一些常规操作任务:您可以将它们标记为剪切、复制和粘贴,您可以将它们移动到一个新的位置,并且可以使用创建它们的应用程序来打开它们。这些操作涉及到两个或更多的步骤,并且不是自动完成的,即首先查找到文件,然后使用 GUI 为下一步的操作对它们进行标记。这种方法对许多用户来说没有问题,但是 Explorer 需要的不仅是这些。
UNIX 的 find
命令可以删除、复制、移动和执行其查找到的文件。另外,使用 -exec
参数可以根据您所需要的 UNIX 命令的序列来自动地运行这些文件。它甚至可以在对任何文件执行这些操作前,进一步让您进行确认。
与大多数 UNIX 命令一样,UNIX find
命令具有一长串令人生畏的选项和开关,它们会阻碍人们深入地学习该命令,但正是因为其范围广阔,真正的 Explorer 并不会被它们吓倒。一条好的通用原则在简化一个复杂问题时都会经过漫长的过程。启动一个 xterm,并尝试执行下面的命令:
$ find . -name *.gif -exec ls {} \; |
-exec
参数中包含了真正有价值的操作。当查找到匹配搜索条件的文件时,-exec
参数定义了将对这些文件进行什么操作。该示例告诉计算机进行如下操作:
- 从当前文件夹开始往下搜索,紧跟在
find
之后,使用点号 (.
)。 - 定位所有名称以 .gif 结尾的文件(图形文件)。
- 列出所有查找到的文件,使用
ls
命令。
需要对 -exec
参数进行更深入地研究。当查找到匹配搜索条件的文件名时,find
命令执行 ls {}
字符串,用文件名和路径代替文本 {}
。假设在搜索中查找到 saturn.gif 文件,find
将执行如下所示的命令:
$ ls ./gif_files/space/solar_system/saturn.gif |
本文余下的内容建立在这条一般原则之上:仔细地使用 find
命令可以让 UNIX 文件系统的管理工作变得更加容易。例如,如果您使用了 -fstype
参数,find
命令可以根据查找到的文件所处的文件系统的类型来对命令进行相应的处理。在 find
命令对查找到的文件执行相应命令前将对您进行提示,这通常是非常有用的,您可以使用 -ok
参数告诉它继续执行该操作,接下来我们将对其进行介绍。
-ok
是 -exec
参数的一个重要的替代项,它的行为和 -exec
一样,但它会提示您是否要对文件运行相应的命令。假设您想要删除 home 目录中的大部分 .txt 文件,但希望能够逐个文件地执行该操作。像 UNIX 中的 rm
命令那样的删除操作是很危险的,因为当使用像 find
这样的自动化处理方式来查找文件时,它可能一不小心会删除重要的文件,您也许希望在删除这些系统查找到的文件之前对其进行仔细检查。
下面的命令列出了您的 home 目录中所有的 .txt 文件。要删除这些文件,必须在 find
命令通过列出文件名提示您确认操作时输入 Y
或者 y
:
$ find $HOME/. -name *.txt -ok rm {} \; |
它列出了查找到的每个文件,并且系统将暂停以等待您输入 Y
或者 y
。如果您按下 Enter 键,系统将不会删除该文件。清单 1 显示了一些示例结果:
< rm ... /home/bill/./.kde/share/apps/karm/karmdata.txt > ? < rm ... /home/bill/./archives/LDDS.txt > ? < rm ... /home/bill/./www/txt/textfile1.txt > ? < rm ... /home/bill/./www/txt/faq.txt > ? < rm ... /home/bill/./www/programs/MIKE.txt > ? < rm ... /home/bill/./www/programs/EESTRING.txt > ? . . . |
系统将在每个问号之后暂停,在本示例中,每次都按下了 Enter 键以继续处理下一个文件。(没有删除任何文件。)-ok
参数允许您控制每个查找到的文件的自动化处理过程,这样就添加了一种避免自动删除文件的安全措施。
如果在使用 -ok
参数时涉及到过多的文件,那么一个好的方法是先运行带 -exec
的 find
命令以列出所有将要删除的文件,然后在经过检查确保其中不会删除重要的文件后,再次运行该命令,其中用 rm
代替 ls
。
-exec
和 -ok
都非常有用,您必须确定在当前情况下哪一个能够更好的工作。请记住,安全第一!
您可以使用 find
命令执行各种各样的任务。本部分内容提供了使用 find
命令来管理文件系统的几种方式的示例。
为了保持简单,这些示例都避免了使用涉及通过管道将一个命令的输出传递到另一个命令的 -exec
命令。然而,您完全可以根据自己需要在 find 命令的 -exec
子句中使用这样的命令。
您可以使用 find
命令来清除目录或子目录中在正常使用过程中生成的临时文件,这样可以节省磁盘空间。要实现该操作,请使用下面的命令:
$ find . \( -name a.out -o -name '*.o' -o -name 'core' \) -exec rm {} \; |
括号中的文件掩码 标识出了需要删除的文件类型,每个文件掩码的前面都有 -name
。该列表可以扩展为包括您需要清除的系统中的任何临时文件类型。在代码的编译和连接过程中,程序员及其工具会生成示例中的那些文件类型:a.out
、*.o
和 core
。其他的用户通常也会生成类似的临时文件,可以使用如 *.tmp
、*.junk
等文件掩码来对命令进行相应的编辑。您可能还发现将命令放入一个称作 clean
的脚本中非常有用,当需要清除一个目录中的内容的时候就可以执行该脚本。
find
命令允许您复制目录中的全部内容,同时保持每个文件和子目录的权限、时间和所有权。要完成该操作,需要组合使用 find
和 cpio
命令,如下所示:
$ cd /path/to/source/dir $ find . | cpio -pdumv /path/to/destination/dir |
cpio
命令是一个复制命令,它设计用来将文件复制到或复制出一个 cpio 或 tar 存档文件,并自动地保持文件和子目录的权限、时间和所有权。
有些人使用每个文本文件的第一行作为标题或者文件内容的描述。可以使用列出文件名和所有文本文件第一行内容的报表更方便地对大量的文本文件进行筛选。下面的命令在报表中列出了您的 home 目录中所有文本文件的第一行内容,便于进一步地根据需要使用 less
命令进行检查:
$ find $HOME/. -name *.txt -exec head -n 1 -v {} \; > report.txt $ less < report.txt |
要为生成大量文件的应用程序维护 LOG 和 TMP 文件存储空间,可以将下列命令放入到每天运行的 cron
任务中:
$ find $LOGDIR -type d -mtime +0 -exec compress -r {} \; $ find $LOGDIR -type d -mtime +5 -exec rm -f {} \; |
第一个命令找到 $LOGDIR 目录中所有包含在 24 小时内 (-mtime +0
) 进行了修改的数据的目录 (-type d
),并对它们进行压缩 (compress -r {}
) 以节省磁盘空间。如果这些目录超过了一个工作周 (-mtime +5
),第二个命令则将其删除 (rm -f {}
),以便增加磁盘上的可用空间。通过这种方式,cron 任务自动地根据您所指定的时间窗口对目录进行维护。
如果您想要将复杂的目录树从一台计算机复制到另一台计算机,同时保持副本权限以及 User ID 和 Group ID(UID 和 GID——操作系统所使用的标记文件的所有权的数值),并且不复制用户文件,那么就需要再次使用 find
和 cpio
:
$ cd /source/directory $ find . -depth -print | cpio -o -O /target/directory |
要查找不指向任何地方的链接,可以使用带 find
的 perl
解释器,如下所示:
$ find / -type l -print | perl -nle '-e || print'; |
该命令从最顶层目录 (/) 开始,列出由 perl
解释器确定不指向任何地方 (-nle '-e || print'
) 的所有链接 (-type l -print
),关于 Unix Guru Universe 站点中这个技巧的更详细的信息,请参阅参考资料部分。如果您想要删除这些文件,可以进一步使用管道将输出传递到 rm -f {}
命令。当然,Perl 可以在大多数的 UNIX 工具包中找到,它是许多功能强大的解释性语言工具中的一种。
在 UNIX 中,可能会有错误的或恶意的程序创建包含无法打印的字符的目录。定位和重命名这些目录,这样就可以更容易地检查并删除它们。要完成该操作,您首先需要在 ls
中包含 -i
开关,以获取该目录的索引节点的数值。然后,使用 find
将索引节点的数值转换为一个可以使用 mv
命令进行重命名的文件名:
$ ls -ail $ find . -inum 211028 -exec mv {} newname.dir \; |
要列出所有长度为零的文件,请使用下面的命令:
$ find . -empty -exec ls {} \; |
在查找到空文件之后,您可以选择用 rm
命令来代替 ls
命令,以删除这些文件。
很明显,您对 UNIX find
命令的使用受到知识和创造性的限制。
使用 find
命令,可以轻松地浏览 UNIX 文件系统中丰富的内容。很值得花时间来试验该命令,并了解它能为您做些什么。正如本文中所列出的示例,您可以通过许多创造性的方式来使用 find
,这样可以轻松地浏览和管理文件系统,并且充满乐趣。
学习
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文
- 在 Commands Reference, Volume 2, find Command 中,可以学习关于
find
命令的更多内容,特别是对于 IBM® AIX® 环境。 - Unix Guru Universe (UGU) 站点为 UNIX 提供了极好的资源。
- 关于如何通过使用许多可用的选项来加速
find
命令的搜索的技巧,请阅读 UHACC -- Presentations:using find。 - Linux.com | CLI Magic:GNU find 描述了使用
find
命令的基本知识。注意:CLI 代表命令行接口 (Command Line Interface),与 GUI 相反! - Use free software within commercial UNIX (developerWorks, February 2006) 的作者指出了如何在不同的商业版本之间使用功能不同的 UNIX 命令,如
find
或tar
。阅读他所介绍的如何在您的商业 UNIX 版本上安装 GNU 工具以实现兼容性。 - 跟踪最新的 developerWorks 技术事件与网络广播。
讨论
- 参与 developerWorks 博客,从而参加到 developerWorks 社区中来。
Bill Zimmerly 是一位知识工程师和具有不同版本 UNIX 和 Microsoft® Windows® 专长的底层系统程序员,同时,他也是一位崇尚逻辑改变的自由思想者。Bill 还被认为是一个非理性的人。这里所说的非理性来自于,“理性的人让自己适应世界。非理性的人却试图让世界适应自己。因此所有的进步都依赖于那些非理性的人”(乔治·萧伯纳)。他的爱好是创建新的技术并撰写相关的文章。他住在 Missouri 的 Hillsboro 郊外,那里空气新鲜、景色怡人,并且到处都是上等的葡萄酒酿造厂。没有什么能比得上一边用水晶般透明的杯子喝着 Stone Hill Blush,一边撰写着关于 UNIX shell 脚本的文章。您可以通过 bill@zimmerly.com 与 Bill 联系。 |
发表评论
-
CVS做版本管理项目的目录结构
2008-09-15 09:54 1681目录结构是:/home/cvsroot ... -
Tomcat OutOfMemory Error: PermGen Space
2008-08-30 13:33 1620This FAQ applies to: 5.1 Using ... -
使用Apache 反向代理功能连接 Tomcat
2008-08-24 23:04 6004Apache HTTP server 和 Tomc ... -
Windows与Vmware下的Linux文件共享方式总结
2008-08-03 11:18 12881.利用Samba 这是我用得最多的方式 2.在Linux下 ... -
中文编码转Unicode
2008-08-03 11:16 2466格式 native2ascii 所要转码文件 转码后文 ... -
Java 编程技术中汉字问题的分析及解决
2008-08-03 11:15 1175Java 编程技术中汉字问题的分析及解决 ... -
EasyJWeb
2008-08-03 11:14 1012EasyJWeb是基于java技术,应用于WEB应用程 ... -
eclipse中中文乱码解决
2008-08-03 11:13 2231可依次选择"window">> ... -
JBoss启动时无法转换DailyRollingFileAppender类的解决办法
2008-08-03 11:12 2330错误现象: 12:49:46,251 INFO [STDO ... -
struts1.2 显示多维数组
2008-08-03 11:09 1145jsp page: <logic:iterate na ... -
软件需求分析规格说明书
2008-08-03 11:09 3217中华人民共和国国家标 ... -
[转] MYSQL导入导出常用命令
2008-08-03 11:08 976一、备份数据库:(命令在DOS的mysql\bin目录下执行) ... -
产生Hibernate数据库表映射文件的方法
2008-08-03 11:00 14231。根据powerdesigner的cdm文件生成 hiber ... -
用Eclipse、Tomcat、Lomboz搭建jsp开发环境
2008-08-03 10:59 22891.安装jdk1.4.0+,安装Tomca ... -
POJO 与 PO的 概念
2008-08-03 10:58 828POJO = pure old java object or ... -
spring入门编程问题集锦
2008-08-03 10:54 1207spring入门编程问题集锦 1、如何学习Spring? ... -
nohup命令
2008-08-03 10:53 2145nohup 命令 用途 不挂断 ... -
板载RAID在安装OS时都需添加驱动,否则认不出硬盘。
2008-08-03 10:52 13551、 PermGen space的全称是Permanent ... -
RAID问题集锦
2008-08-03 10:52 981板载RAID在安装OS时都需添加驱动,否则认不出硬盘。WIN2 ... -
引导Linux的三种简便方法
2008-08-03 10:50 899引导Linux的三种简便方法方法1:引导软盘(1)在linux ...
相关推荐
这是一套完整的Unix培训教材,包括Unix常用命令及SHELL编程基础与高级技巧,PDF格式,共30个文件。另有2个Word文档。包内文件清单如下: 01_Shell-文件安全与权限.PDF 02_Shell-使用find和xargs.PDF 03_Shell-...
2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 17 2.1.7 查找比某个文件新...
第1章 UNIX操作系统概述 7 1.1 UNIX操作系统简介 7 1.2 UNIX系统组成 7 1.3 UNIX启动过程 8 1.4 UNIX用户登录过程 8 1.5 与UNIX有关的几个名词 9 第2章 UNIX基本常识 11 ...6.3.3 Find命令举例 87 6.4 grep命令详解 99
第二章 使用FIND和XARGS 第三章 后台执行命令 第四章 文件名置换 第五章 SHELL输入输出 第六章 命令执行顺序 第二部分 文本过滤 第七章 正则表达式介绍 第八章 GERP家族 第九章 AWK介绍 第十章 SED用法介绍...
第二章 使用FIND和XARGS 第三章 后台执行命令 第四章 文件名置换 第五章 SHELL输入输出 第六章 命令执行顺序 第二部分 文本过滤 第七章 正则表达式介绍 第八章 GERP家族 第九章 AWK介绍 第十章 SED用法介绍 第十一...
六.find命令 12 七.test命令 12 八.expr命令 13 九.流程控制语法 13 1 if then elif else fi语句 13 4 for语句 15 6 while语句 16 7 until 语句 17 8 break及continue 18 9 case 语句 18 十.shell脚本调试 19 ...
2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 17 2.1.7 查找比某个文件新...
第二章 使用FIND和XARGS 第三章 后台执行命令 第四章 文件名置换 第五章 SHELL输入输出 第六章 命令执行顺序 第二部分 文本过滤 第七章 正则表达式介绍 第八章 GERP家族 第九章 AWK介绍 第十章 SED用法介绍 第十一...
2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 17 2.1.7 查找比某个文件新...
2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 17 2.1.7 查找比某个文件新...
2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 17 2.1.7 查找比某个文件新...
2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 17 2.1.7 查找比某个文件新...
find命令选项。 ? 使用f i n d命令不同选项的例子。 ? 配合f i n d使用x a rg s命令的例子。 第3章后台执行命令 ? 设置c r o n t a b文件,并用它来提交作业。 ? 使用a t命令来提交作业。 ? 在后台提交作业。 ? ...
第二章 使用FIND和XARGS 第三章 后台执行命令 第四章 文件名置换 第五章 SHELL输入输出 第六章 命令执行顺序 第二部分 文本过滤 第七章 正则表达式介绍 第八章 GERP家族 第九章 AWK介绍 第十章 SED用法介绍 第十一...
2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 17 2.1.7 查找比某个文件新...