Linux文件查找及压缩

Linux文件查找(locate & find)

locate

    查询系统上预建的文件索引数据库(速度快,但更新不实时)

    /var/lib/mlocate/mlocate.db

    依赖于事先构建的索引

    索引的构建是在系统较为空闲时自动进行(周期性任务), 管理员手动更新数据库(updatedb,实际生产环境中不建议使用)

    索引构建过程需要遍历整个根文件系统,极消耗资源


工作特点:

    查找速度快

    模糊查找

    非实时查找

    搜索的是文件的全路径,不仅仅是文件名

    可能只搜索用户具备读取和执行权限的目录


用法

    locate KEYWORD

    选项

        • -i 执行区分大小写的搜索

        • -n N 只列举前N个匹配项目

         locate foo

        • 搜索名称或路径中带有“ foo”的文件

         locate -r ‘\.foo$’

        • 使用Regex来搜索以“ .foo”结尾的文件


find ( 精确查找,支持匹配符;只搜索磁盘文件(如proc不搜);默认自带递归)

    实时查找工具,通过遍历指定路径完成文件查找;

工作特点:

    • 查找速度略慢

    • 精确查找

    • 实时查找

    • 可能只搜索用户具备读取和执行权限的目录

语法:

    find [OPTION]… [查找路径] [查找条件] [处理动作]

    查找路径:指定具体目标路径;默认为当前目录

    查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件

    处理动作:对符合条件的文件做操作,默认输出至屏幕(如 -ls )

根据文件名和inode查找

    -name "文件名称":支持使用glob

    *, ?, [], [^]

    -iname "文件名称":不区分字母大小写

    -inum n 按inode号查找

    -samefile name 相同inode号的文件

    -links n 链接数为n的文件

    -regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称

根据属主、属组查找:(仅根据UID号 GID号进行搜索,并不会根据用户名和组名进行搜索)

    -user USERNAME:查找属主为指定用户(UID)的文件

    -group GRPNAME: 查找属组为指定组(GID)的文件

    -uid UserID:查找属主为指定的UID号的文件

    -gid GroupID:查找属组为指定的GID号的文件

    -nouser:查找没有属主的文件

    -nogroup:查找没有属组的文件

根据文件类型查找:

-type TYPE:

    f: 普通文件

    d: 目录文件

    l: 符号链接文件

    s:套接字文件

    b: 块设备文件

    c: 字符设备文件

    p: 管道文件

组合条件:(与 -a 的优先级比 或 -o  的优先级要高 ; 如果命令中有先计算或 -o然后再计算与-a的,要加括号 ;  (      -o      )       -a      )     )

    与: -a

    或: -o

    非: -not, !

    德·摩根定律:

    (非 P) 或 (非 Q) = 非(P 且 Q)

    (非 P) 且 (非 Q) = 非(P 或 Q)

    示例:

    !A -a !B = !(A -o B)

    !A -o !B = !(A -a B)


例子

    find -name snow.png

    • 搜索名为snow.png的文件

    find -iname snow.png

    • 不分大小写地搜索名为snow.png、 Snow.png、SNOW.PNG等等的文件

    find / -name “*.txt”

    find /var –name “*log*”

    find -user joe -group joe

    搜索被用户joe 以及组群joe所拥有的文件

    find -user joe -not -group joe

    find -user joe -o -user jane

    find -not \( -user joe -o -user jane \)

    find / -user joe -o -uid 500

    找出/tmp目录下,属主不是root,且文件名不以f开头的文件

    find /tmp \( -not -user root -a -not -name 'f*' \) -ls

    find /tmp -not \( -user root -o -name 'f*' \) –ls

排除目录

    示例:查找/etc/下,除/etc/sane.d目录的其它所有.conf后缀的文件

    find /etc -path ‘/etc/sane.d’ -a -prune

    -o -name “*.conf” -print

根据文件大小来查找

    -size [+|-]#UNIT    //-size 10k 只是搜索大小为(9-10]K的文件

常用单位: k, M, G

    #UNIT: (#-1, #]

    如: 6k 表示(5k,6k]

    -#UNIT: [0,#-1]

    如: -6k 表示[0,5k]

    +#UNIT: (#,∞)

    如: +6k 表示(6k,∞)

根据时间戳:(正数为未来时间,修改时间;负数为过去时间)

以“天”为单位

    -atime [+|-]#,    

    #: [#,#+1)        // -atime 7 : [7,8)

    +#: [#+1,∞]      //atime +7 : [8,∞]

    -#: [0,#)            //atime -7 : [0,7)

    -mtime

    -ctime

以“分钟”为单位

    -amin

    -mmin

    -cmin

根据权限查找:

    -perm [/|-]MODE

    MODE: 精确权限匹配(权限前不带任何符号,即为精确匹配)

    /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配

    即可,或关系+ : centos7之前的版本用 ; centos7开始用 /

    MODE:每一类对象都必须同时拥有指定权限,与关系

    0 表示不关注(什么权限都可以,凑数)

    find -perm 755 会匹配权限模式恰好是755的文件

    只要当任意人有写权限时, find -perm +222就会匹配

    只有当每个人都有写权限时, find -perm -222才会匹配

    只有当其它人( other)有写权限时, find -perm -002才会匹配

处理动作:

     -print:默认的处理动作,显示至屏幕;

    -ls:类似于对查找到的文件执行“ ls -l”命令

    -delete:删除查找到的文件;

    -fls file:查找到的所有文件的长格式信息保存至指定文件中

    -ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;对于每个文件执行命令之前,都会交互式要求用户确认

    -exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;(直接执行,不会要求用户确认)

    {}: 用于引用查找到的文件名称自身

find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令

有些命令不能接受过多参数,此时命令执行可能会失败,下面方式可规避此问题

    find | xargs COMMAND

    -0 换行

    -rm 删除

软件包管理

软件运行环境

    API: Application Programming Interface

    POSIX: Portable OS

    程序源代码 –> 预处理 –> 编译 –> 汇编 –> 链接

    静态编译:

    共享编译: .so

    ABI: Application Binary Interface

    Windows与Linux不兼容

    ELF(Executable and Linkable Format)

    PE( Portable Executable)

    库级别的虚拟化:

    Linux: WINE

    Windows: Cywin


C程序编译过程

Linux文件查找及压缩

Java程序运行

Linux文件查找及压缩

开发语言

    系统级开发

        C

        C++

    应用级开发

        java

        delphi

        Python

        go

        php

        perl

        ruby

包管理器

    二进制应用程序的组成部分:

    二进制文件、库文件、配置文件、帮助文件

    程序包管理器:

    debian: deb文件, dpkg包管理器

    redhat: rpm文件, rpm包管理器

    rpm: Redhat Package Manager

    RPM Package Manager

包命名

    源代码: name-VERSION.tar.gz|bz2|xz

    VERSION: major.minor.release

    rpm包命名方式:

    name-VERSION-release.arch.rpm

    例: bash-4.2.46-19.el7.x86_64.rpm

    VERSION: major.minor.release

    release: release.OS

常见的arch:

    x86: i386, i486, i586, i686

    x86_64: x64, x86_64, amd64

    powerpc: ppc

    跟平台无关: noarch

1.png

包命名和工具

    包:分类和拆包

        Application-VERSION-ARCH.rpm: 主包

        Application-devel-VERSION-ARCH.rpm 开发子包

        Application-utils-VERSION-ARHC.rpm 其它子包

        Application-libs-VERSION-ARHC.rpm 其它子包

    包之间:可能存在依赖关系,甚至循环依赖解决依赖包管理工具:

        yum: rpm包管理器的前端工具

        apt-get: deb包管理器前端工具

        zypper: suse上的rpm前端管理工具

        dnf: Fedora 18+ rpm包管理器前端管理工具

库文件

    查看二进制程序所依赖的库文件:

    ldd /PATH/TO/BINARY_FILE

    管理及查看本机装载的库文件:

    ldconfig

    /sbin/ldconfig -p: 显示本机已经缓存的所有可用库文件

    名及文件路径映射关系

    配置文件: /etc/ld.so.conf, /etc/ld.so.conf.d/*.conf

    缓存文件: /etc/ld.so.cache


包管理器

    程序包管理器:

    功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作

1、包文件组成 (每个包独有)

    RPM包内的文件

    RPM的元数据,如名称,版本,依赖性,描述等

    安装或卸载时运行的脚本

2、数据库(公共)

    程序包名称及版本

    依赖关系

    功能说明

    包安装后生成的各文件路径及校验码信息

程序包的来源

    管理程序包的方式:

    使用包管理器: rpm

    使用前端工具: yum, dnf

    获取程序包的途径:

    (1) 系统发版的光盘或官方的服务器;

        CentOS镜像:

        https://www.centos.org/download/

        http://mirrors.aliyun.com

        http://mirrors.sohu.com

        http://mirrors.163.com

    (2) 项目官方站点

        程序包的来源

    (3) 第三方组织:

        Fedora-EPEL:

        Extra Packages for Enterprise Linux

        Rpmforge:RHEL推荐,包很全

    搜索引擎:

        http://pkgs.org

        http://rpmfind.net

        http://rpm.pbone.net

        https://sourceforge.net/

    (4) 自己制作

        注意:检查其合法性: 来源合法性,程序包的完整性

rpm包管理

    CentOS系统上使用rpm命令管理程序包:

    安装、卸载、升级、查询、校验、数据库维护

安装

    rpm {-i|–install} [install-options] PACKAGE_FILE…

    -v: verbose

    -vv:

    -h: 以#显示程序包管理执行进度

    rpm -ivh PACKAGE_FILE …

rpm包安装

    [install-options]

    –test: 测试安装,但不真正执行安装; dry run模式

    –nodeps:忽略依赖关系

    –replacepkgs | replacefiles

    –nosignature: 不检查来源合法性

    –nodigest:不检查包完整性

    –noscipts:不执行程序包脚本片断

    %pre: 安装前脚本; –nopre

    %post: 安装后脚本; –nopost

    %preun: 卸载前脚本; –nopreun

    %postun: 卸载后脚本; –nopostun

rpm包升级

    升级:

    rpm {-U|–upgrade} [install-options] PACKAGE_FILE…

    rpm {-F|–freshen} [install-options] PACKAGE_FILE…

    upgrade:安装有旧版程序包,则“升级”

    如果不存在旧版程序包,则“安装”

    freshen:安装有旧版程序包,则“升级”

    如果不存在旧版程序包,则不执行升级操作

    rpm -Uvh PACKAGE_FILE …

    rpm -Fvh PACKAGE_FILE …

    –oldpackage:降级

    –force: 强行升级

升级注意项

    注意:

    (1) 不要对内核做升级操作; Linux支持多内核版本并存,因此 ,对直接安装新版本内核

    (2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留



1、写个脚本:

   *

 ***

******

********

================================================

#!/bin/bash
#
read -p "Do you want to see how many floors ? " y
r=1
l=1
o="\033[42m \033[0m"
p="\033[42m*\033[0m"
if echo $y | egrep -q "^[[:digit:]]+$";then
#判断用户输入的是否为纯数字
while [[ $r -le $y ]];do
#判读打印的行是否大于用户要求的行
while [[ $l -le $[$[$y*2]-1] ]];do
#固定行,根据光标所在的列有要求的打印空格或者*
if [[ $l -le $[$y-$r] ]];then
echo -ne $o
elif  [[ $l -ge $[$[$[2*$r]+$y]-$r]  ]] ;then
echo -ne $o
else
echo -ne $p
fi
let l++
done
echo
let r++
l=1
done
else
echo "please try again"
fi




2、用until循环实现国际象棋棋盘

#!/bin/bash
#
r="\033[41m \033[0m"
u="\033[42m \033[0m"
l=1
h=1
until [[ $l -gt 8 ]];do
until [[ $h -gt 8 ]];do
[[ $[$h+$l]%2 -eq 0 ]] && echo -en $r || echo -en $u
let h++
done
echo
h=1
let l++
done


    

原创文章,作者:hunter,如若转载,请注明出处:http://www.178linux.com/36368

(0)
hunterhunter
上一篇 2016-08-19
下一篇 2016-08-19

相关推荐

  • N28-第三周作业

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。
    2、取出最后登录到当前系统的用户的相关信息。
    3、取出当前系统上被用户当作其默认shell的最多的那个shell。
    4、将/etc/passwd中的第三个字段数值最大的后10个用户的信息全部改为大写后保存至/tmp/maxusers.txt文件中。
    5、取出当前主机的IP地址,提示:对ifconfig命令的结果进行切分。
    6、列出/etc目录下所有以.conf结尾的文件的文件名,并将其名字转换为大写后保存至/tmp/etc.conf文件中。
    7、显示/var目录下一级子目录或文件的总个数。
    8、取出/etc/group文件中第三个字段数值最小的10个组的名字。
    9、将/etc/fstab和/etc/issue文件的内容合并为同一个内容后保存至/tmp/etc.test文件中。
    10、请总结描述用户和组管理类命令的使用方法并完成以下练习:
    (1)、创建组distro,其GID为2016;
    (2)、创建用户mandriva, 其ID号为1005;基本组为distro;
    (3)、创建用户mageia,其ID号为1100,家目录为/home/linux;
    (4)、给用户mageia添加密码,密码为mageedu;
    (5)、删除mandriva,但保留其家目录;
    (6)、创建用户slackware,其ID号为2002,基本组为distro,附加组peguin;
    (7)、修改slackware的默认shell为/bin/tcsh;
    (8)、为用户slackware新增附加组admins;

    2017-12-17
  • dns 服务

     DNS服务 1.正向解析    1. 创建解析库                    2.改配置文件主要改 any no no 3个选项   3.添加一个解…

    2017-05-31
  • linux权限管理

    linux文件权限    文件的属性和权限的设置对于linux系统来说是相当重要的,如果对这一块的知识没有一个深入的了解,你的系统就有可能有很大的危险。那么首先我们来看一看文件的属性所对应的都是什么意思吧。 上图第一个字符是d,他代表了文件的类型,d的意思就是目录文件,那么除了目录文件还有什么文件呢?    …

    Linux干货 2016-08-04
  • Linux用户及组的管理相关知识

    Linux用户及组的管理相关知识 1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 ~]# who | cut -d " " -f1 | sort -u 2、取出最后登录到当前系统的用户的相关信息。 ~]# last -x | head -1 3、取出当前系统上被用户当作其默认shell的最多的那…

    Linux干货 2016-10-05
  • N25_第二周作业_leon

    第二周博客作业_leon 1.       Linux上的文件管理类命令有哪些?其常用的使用方法及其相关示例演示 常用文件管理类命令有: mkdir、touch、rmdir、cp、rm、mv   mkdir—-创建目录 -m  直接设置权限(非默认权限) -v&nbs…

    Linux干货 2016-12-23
  • 用户和组的管理

    在Linux系统上,用户管理是基于用户名和密码的方式进行资源的分配的,Linux上的用户分为以下的类别: 管理员 : root  ,UID为0 (这个用户有极大的权限,可以直接无视很多的限制,包括读写执行的权限。所以这个用户的使用要小心,因为他的权限太大。) 普通用户的UID:1-65535 普通用户又可分为: 系统用户(已经存…

    2017-04-08

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-19 13:21

    文章对一些概念的东西进行了罗列,也不解释这是什么,是用来做什么的,就跟笔记一样,望以后能该进。