扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
两个方式:find命令或者shell脚本。
目前创新互联建站已为1000多家的企业提供了网站建设、域名、网络空间、绵阳服务器托管、企业网站设计、伊犁网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
1、find命令
(1)find是linux下用于查找文件的通用方法。
(2)find语法: find [指定查找目录] [查找规则] [查找完后执行的action]
(3)例如:find /tmp -name wa* -type l ,是在/tmp下查找名为wa开头且类型为符号链接的文件。找到就表示存在。
2、shell脚本
(1)在进行文件的自动处理中常常需要自动判别,下面的脚本判断test.log是否存在,存在则显示文件存在,否则显示文件不存在。
(2)例子:编辑一个脚本判断文件是否存在。
vi t.sh
#!/bin/bash
if [ -e /temp/test.log ];then //这里是判断语句,-e表示进行比较结果为真则存在
echo "文件存在"
else
echo "文件不存在"
fi
保存退出
执行:
sh t.sh
每一种操作系统都是由成千上万个不同种类的文件所组成的 其中有系统本身自带的文件 用户自己的文件 还有共享文件等等 我们有时候经常忘记某份文件放在硬盘中的哪个地方 在微软的WINDOWS操作系统中要查一份文件是相当简单的事情 只要在桌面上点击 开始 搜索 中就能按照各种模式在本地硬盘上 局域网络 甚至在INTERNET上查各种文件及档案 可是使用Linux的用户就没有那么幸运了 在Linux上查 某个文件确实是一件比较麻烦的事情 毕竟在Linux中需要我们使用专用的 查 命令来寻找在硬盘上的文件 Linux下的文件表达格式非常复杂 不象WINDOWS DOS下都是统一的AAAAAAA BBB格式那么方便查 在WINDOWS中 只要知道要查的文件的文件名或者后缀就非常容易查到 Linux中查 文件的命令通常为 find 命令 find 命令能帮助我们在使用 管理Linux的日常事务中方便的查 出我们需要的文件 对于Linux新手来说 find 命令也是了解和学习Linux文件特点的方法 因为Linux发行版本繁多 版本升级很快 在Linux书籍上往往写明某个配置文件的所在位置 往往Linux新手按图索骥还是不能找到 比如说REDHAT Linux O和REDHAT Linux 中有些重要的配置文件所在的硬盘位置和文件目录就有了很大的改变 如果不学会使用 find 命令 那么在成千上万的Linux文件中要找到其中的一个配置文件是相当困难的 笔者在没有精通 find 命令之前就吃过这样的苦头 好 下面就详细为大家介绍强大的 find 命令的全部使用方法和用途 透过文件名查法︰ 这个方法说起来就和在WINDOWS下查 文件一样容易理解了 如果你把这个文件放在单个的活页夹里面 只要使用常见的 ls 命令就能方便的查 出来 那么使用 find 命令来查 它就不能给你留下深刻的印象 毕竟 find 命令的强大功能不止这个 如果知道了某个文件的文件名 而不知道这个文件放到哪个活页夹 甚至是层层套嵌的活页夹里 举例说明 假设你忘记了这个文件在系统的哪个目录下 甚至在系统的某个地方也不知道 则这是可以使用如下命令︰ find / name 这个命令语法看起来很容易就明白了 就是直接在find后面写上 name 表明要求系统按照文件名查 最后写上这个目标文件名即可 稍等一会系统会在计算器屏幕上显示出查 结果列表︰ etc/这就是这个文件在Linux系统中的完整路径 查成功 如果输入以上查命令后系统并没有显示出结果 那么不要以为系统没有执行find/ name 命令 而可能是你的系统中没有安装Apache服务器 这时只要你安装了Apache Web服务器 然后再使用find / name 就能找到这个配置文件了 无错误查技巧︰ 在Linux系统中 find 命令是大多数系统用户都可以使用的命令 并不是ROOT系统管理员的专利 但是普通用户使用 find 命令时也有可能遇到这样的问题 那就是Linux系统中系统管理员ROOT可以把某些文件目录设置成禁止访问模式 这样普通用户就没有权限用 find 命令来查询这些目录或者文件 当普通用户使用 find 命令来查询这些文件目录是 往往会出Permissiondenied (禁止访问)字样 系统将无法查询到你想要的文件 为了避免这样的错误 我们可是使用转移错误提示的方法尝试着查文件 输入find / name access_log /dev/null 这个方法是把查 错误提示转移到特定的目录中去 系统执行这个命令后 遇到错误的讯息就直接输送到stderrstream 中 access_log 就是表明系统将把错误讯息输送到stderrstream 中 /dev/null是一个特殊的文件 表明空的或者错误的讯息 这样查询到的错误讯息将被转移了 不会再显示了 在Linux系统查 文件也会遇到这样一个实际问题 如果我们在整个硬盘 这个系统中查 某个文件就要花费相当长的一段时间 特别是大型Linux系统和容量较大的硬盘 文件放在套嵌很深的目录中的时候 如果我们知道了这个文件存放在某个大的目录中 那么只要在这个目录中往下找就能节省很多时间了 使用find /etc name 就可以解决这个问题 上面的命令就是表示在etc目录中查询这个文件 这里再说明一下 / 这个函数符号的含义 如果输入 find/ 就是表示要求Linux系统在整个ROOT目录下查 文件 也就是在整个硬盘上查 文件 而 find/etc 就是只 在 etc目录下查 文件 因为 find/etc 表示只在etc目录下查 文件 所以查 的速度就相应要快很多了 根据部分文件名查 方法︰ 这个方法和在WINDOWS中查 已知的文件名方法是一样的 不过在Linux中根据部分文件名查 文件的方法要比在WINDOWS中的同类查 方法要强大得多 例如我们知道某个文件包含有srm这 个字母 那么要找到系统中所有包含有这 个字母的文件是可以实现的 输入︰ find /etc name *srm* 这个命令表明了Linux系统将在/etc整个目录中查 所有的包含有srm这 个字母的文件 比如 absrmyz tibc srm等等符合条件的文件都能显示出来 如果你还知道这个文件是由srm 这 个字母打头的 那么我们还可以省略最前面的星号 命令如下︰ find/etc name srm* 这是只有像srmyz 这样的文件才被查 出来 象absrmyz或者 absrm这样的文件都不符合要求 不被显示 这样查 文件的效率和可靠性就大大增强了 根据文件的特征查询方法︰ 如果只知道某个文件的大小 修改日期等特征也可以使用 find 命令查 出来 这和WINDOWS系统中的 搜索 功能是基本相同的 在微软的 搜索 中WINDOWS中的 搜索助理 使得搜索文件和活页夹 打印机 用户以及网络中的其它计算器更加容易 它甚至使在Internet 上搜索更加容易 搜索助理 还包括一个索引服务 该服务维护了计算器中所有文件的索引 使得搜索速度更快 使用 搜索助理 时 用户可以指定多个搜索标准 例如 用户可以按名称 类型及大小搜索文件和活页夹 用户甚至可以搜索包含特定文本的文件 如果用户正使用 Active Directory 这时还可以搜索带有特定名称或位置的打印机 例如我们知道一个Linux文件大小为 bytes 那么我们可是使用如下命令来查询 find / size c 字符 c 表明这个要查 的文件的大小是以bytes为单位 如果我们连这个文件的具体大小都不知道 那么在Linux中还可以进行模糊查 模式来解决 例如我们输入find/ size + c 这个命令 则标明我们指定系统在根目录中查出大于 字节的文件并显示出来 命令中的 + 是表示要求系统只列出大于指定大小的文件 而使用 则表示要求系统列出小于指定大小的文件 下面的列表就是在Linux使用不同 find 命令后系统所要作出的查 动作 从中我们很容易看出在Linux中使用 find 命令的模式是很多的 find 命令查 文件只要灵活应用 丝毫不必在WINDOWS中查 能力差 find / amin # 查 在系统中最后 分钟访问的文件 find / atime # 查 在系统中最后 小时访问的文件 find / empty # 查 在系统中为空的文件或者活页夹 find / group cat # 查 在系统中属于 groupcat的文件 find / mmin # 查 在系统中最后 分钟里修改过的文件 find / mtime #查 在系统中最后 小时里修改过的文件 find / nouser #查 在系统中属于作废用户的文件 find / user fred #查 在系统中属于FRED这个用户的文件 下面的列表就是对find命令所可以指定文件的特征进行查 的部分条件 在这里并没有列举所有的查 条件 参考有关Linux有关书籍可以知道所有find命令的查函数 amin n 查 系统中最后N分钟访问的文件 atime n 查 系统中最后n* 小时访问的文件 cmin n 查 系统中最后N分钟被改变状态的文件 ctime n 查 系统中最后n* 小时被改变状态的文件 empty 查 系统中空白的文件 或空白的文件目录 或目录中没有子目录的活页夹 false 查 系统中总是错误的文件 fstype type 查 系统中存在于指定文件系统的文件 例如︰ext gid n 查 系统中文件数字组 ID 为 n的文件 group gname 查 系统中文件属于gnam文件组 并且指定组和ID的文件 Find命令的控制选项说明︰ Find命令也提供给用户一些特有的选项来控制查 操作 下表就是我们总结出的最基本 最常用的find命令的控制选项及其用法 用途描述 daystart 测试系统从今天开始 小时以内的文件 用法类似 amin depth 使用深度级别的查 过程模式 在某层指定目录中优先查 文件内容 follow 遵循通配符链接模式查 ; 另外 也可忽略通配符链接模式查询 help 显示命令摘要 maxdepth levels 在某个层次的目录中按照递减方法查 mount 不在文件系统目录中查 用法类似 xdev noleaf 禁止在非UNUX文件系统 MS DOS系统 CD ROM文件系统中进行最优化查 version 打印版本数字 使用 follow选项后 fin lishixinzhi/Article/program/Oracle/201311/17656
find 命令的基本结构如下:
find [paths] [expression] [actions]
find 命令接受一个或多个 路径 ( paths )作为搜索范围,并在该路径下 递归 地搜索。即检索完指定的目录后,还会对该目录下的子目录进行检索,以及子目录下的子目录。。。直到到达目录树底部。
默认情况下(不带任何搜索条件),find 命令会返回指定目录下的 所有文件 ,所以常常需要通过特定的 expression 对结果进行 筛选 。
find 命令默认的 action 是将所有检索结果打印至标准输出。可以通过自定义 action ,让 find 命令对搜索到的结果执行特定的操作。
这里先不做详细解释,简单地测试下 find 命令:
find 命令中的 -name 选项可以根据文件名称进行检索( 区分大小写 )。如需要忽略文件名中的大小写,可以使用 -iname 选项。
-name 和 -iname 两个选项都支持 wildcards 。如:
find /usr -name '*.txt' 查找 /usr 目录下所有文件名以 .txt 结尾的文件
find /usr -name '????' 查找 /usr 目录下所有文件名刚好为 4 个字符的文件
有些时候,你需要在搜索时匹配某个文件或目录的 完整路径 ,而不仅仅是匹配文件名。可以使用 -path 或 -ipath 选项。
如查找 /usr 下所有文件名以 .txt 结尾的文件或目录,且该文件的父目录必须是 src 。可以使用以下命令:
find /usr -path '*/src/*.txt'
如果只想搜索得到文件 或 目录,即不想它们同时出现在结果中。可以使用 -type 选项指定文件类型。
-type 选项最常用的参数如下:
find /usr -type d -name 'python*' 检索 /usr 下所有文件名以 python 开头的 目录
find 命令支持 -empty 选项用来检索 为空 的文件或目录。空文件即文件里没有任何内容,空目录即目录中没有任何文件或子目录。
find ~ -type d -empty 检索用户主目录下所有的空目录
find 命令也允许用户对当前的匹配条件进行 “反义” (类似于 逻辑非 操作)。
如需要检索 /usr 下所有文件名 不 以 .txt 为后缀的文件。可以使用以下命令:
find /usr -type f ! -name '*.txt'
也可以“翻转”任何其他的筛选条件,如:
find /usr -type f ! -empty 检索 /usr 下所有内容不为空的文件
为了检索归属于特定用户的文件或目录,可以使用 -user 选项。
find / -type f -user starky 检索根目录下所有属主为 starky 的文件
类似于 -user 选项, -group 选项则可以根据文件或目录的 属组 进行检索。
有些时候,需要根据文件创建或修改的时间进行检索。
Linux 系统中,与文件相关联的时间参数有以下三种:
与此对应的是 find 命令中的 -mtime , -atime 和 -ctime 三个选项。
这三个选项的使用遵循以下示例中的规则:
find /usr -type f -mtime 2 检索 /usr 下两天前被修改过的文件
如果觉得 -mtime 等选项以 天 为单位时间有点长,还可以使用 -mmin , -amin , -cmin 三个选项:
find /usr -type f -mtime +50 -mtime -100 检索 /usr 下 50 到 100 天之前修改过的文件
find /usr -type f -mtime 2 -amin 5 检索 /usr 下两天前被修改过且 5 分钟前又读取过的文件
-size 选项允许用户通过文件大小进行搜索(只适用于文件,目录没有大小……)。
表示文件大小的单位由以下字符组成:
另外,还可以使用 + 或 - 符号表示 大于 或 小于 当前条件。
find / -size +1G 检索文件大小高于 1 GB 的文件
find 命令可以使用 -perm 选项以文件权限为依据进行搜索。
如需要检索 /usr 目录下权限为 rwxr-xr-x 的文件,可以使用以下命令:
find /usr -perm u=rwx,g=rx,o=rx
搜索 /usr 目录下所有权限为 r-xr-xr-x (即系统中的所有用户都只有读写权限)的文件和目录,可以使用以下命令:
find /usr -perm a=rx
很多时候,我们只想匹配文件权限的一个 子集 。比如,检索可以直接被任何用户执行的文件,即只关心文件的执行权限,而不用管其读写权限是什么。
上述的需求可以通过以下命令实现: find / -type f -perm /a=x
其中 a=x 前面的 / 符号即用来表示只匹配权限的某个子集(执行权限),而不用关心其他权限的具体设置。
-perm 选项也支持数字形式的文件权限标记。
find /usr -perm 644 搜索 /usr 目录下权限为 644 (即 rwxr-xr-x )的文件
find 命令默认是以 递归 的方式检索项目的,这有时候会导致得到的结果数量非常巨大。可以使用 -maxdepth 限制 find 命令递归的层数。
find / -maxdepth 3 搜索时向下递归的层数最大为 3
在之前的例子中有出现多个搜索条件的 组合 以及对某个搜索条件的 反转 。
实际上 find 命令支持 “and” 和 “or” 两种逻辑运算,对应的命令选项分别是 -a 和 -o 。通过这两个选项可以对搜索条件进行更复杂的组合。
此外还可以使用 小括号 对搜索条件进行 分组 。注意 find 命令中的小括号常需要用 单引号 包裹起来。因小括号在 Shell 中有特殊的含义。
如检索 /usr 下文件名以 python 开头且类型为目录的文件
find /usr -type d -name 'python*'
该命令等同于:
find /usr -type d -a -name 'python*'
更复杂的组合形式如:
find / '(' -mmin -5 -o -mtime +50 ')' -a -type f
-delete 选项可以用来删除搜索到的文件和目录。
如删除 home 目录下所有的空目录:
find ~ -type d -empty -delete
-exec 选项可以对搜索到的结果执行特定的命令。
如需要将 home 目录下所有的 MP3 音频文件复制到移动存储设备(假设路径是 /media/MyDrive ),可使用下面的命令:
find ~ -type f -name '*.mp3' -exec cp {} /media/MyDrive ';'
其中的 大括号 ( {} )作为检索到的文件的 占位符 ,而分号( ; )作为命令结束的标志。因为分号是 Shell 中有特殊含义的符号,所以需要使用单引号括起来。
每当 find 命令检索到一个符合条件的文件,会使用其完整路径取代命令中的 {} ,然后执行 -exec 后面的命令一次。
另一个很重要的用法是,在多个文件中检索某个指定的字符串。
如在用户主目录下的所有文件中检索字符串 hello ,可以使用如下命令:
find ~ -type f -exec grep -l hello {} ';'
创建 Gzip 格式的压缩文件的命令为: tar -czvf filename.tar.gz list of files
现在假设需要将用户主目录下所有的 MP3 文件添加到压缩包 music.tar.gz 中,直观的感觉是,其命令应为如下形式:
find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} ';'
实际情况是,这样得到的 music.tar.gz 其实只包含一个 MP3 文件。
原因是 find 命令 每次 发现一个音频文件,都会再执行一次 -exec 选项后面的压缩命令。导致先前生成的压缩包被覆盖。
可以先让 find 命令检索出所有符合条件的音频文件,再将得到的 文件列表 传递给后面的压缩命令。完整的命令如下:
find ~ -type f -name '*.mp3' -exec tar -czvf music.tar.gz {} +
如果想浏览搜索到的文件(目录)的详细信息(如权限和大小等),可以直接使用 -ls 选项。
find / -type file -size +1G -ls 浏览所有 1G 以上大小的文件的详细信息
A Guide to the Linux “Find” Command
find 命令手册 : man find
1、打开shell连接工具,连接上服务器,pwd查看当前目录,一般进来默认在主目录下。
2、通过命令:cd /切换到主目录下,然后pwd查看当前目录,并用ls可以查看当前目录下的文件及目录。
3、假如要找一个nginx配置文件nginx.conf,那么可以通过find命令查找:find . -name 'nginx.conf'。
4、假如不知道文件的具体名字只是模糊记得几个关键的单词,那么就可以通过模糊匹配去搜索:find 目录 -name '*nginx*' 查找即可。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流