美文网首页
5.文档管理

5.文档管理

作者: Durant_fca1 | 来源:发表于2019-11-21 17:05 被阅读0次

    一、文件管理

    Linux 系统中有 一切皆文件 的说法。
    文件是文件
    硬件设备也是文件
    就是在 Linux 中管理计算机的任何资源都是使用文件的。
    这些资源可以是:
    具体的文件和目录
    键盘、鼠标、网卡、主板、CPU、硬盘等。

    1. 关于对文件的操作命令

    touch 创建一个空的普通文件

    touch   file    # 创建一个名为  file 的空文件
    
    

    cp 复制文件或目录

    cp [选项] 文件1 文件2 ... 目标路径
    若源文件有两个以上,则最后一个目标文件一定是目录。

     选项
    -a   :  相当于-pdr的意思。可将文件的所有属性一起复制,可对目录递归操作。
    
    -p   : 与文件的属性一起复制,而非使用默认属性。
    -d   : 若源文件为链接文件,则复制连接文件而非文件本身。
    -r   :  递归复制,用于目录的复制操作。
    
    -f   :  若目标目录中含有和源文件同名的文件,强制(force)复制,不提示确认。
    -i   :   若目标文件已存在,则提示。
    
    -l   :  建立硬链接(hard link)的连接文件,而非复制文件本身。
    
    -u   : 若目标文件比源文件旧,更新目标文件。
    
    

    示例

    1. 复制 a.txt 文件, 到 /tmp 目录中
    cp      a.txt     /tmp/
    
    
    1. 复制 b.txt 文件, 到 /tmp 目录下,并起名为 b.txt.bak
    cp      b.txt    /tmp/b.txt.bak
    
    
    1. 复制 /opt 目录到 /tmp 目录下
    cp    -a  /opt    /tmp/
    
    

    最佳实战:

    当目标是一个目录时,建议目录名后面加上路径分隔符 /, 这样比较易读,可以明确的看出来复制后的文件名。

    假如复制的是一个目录,建议都加上 -a 选项

    rm 删除文件或目录

    选项
    
    -f  :  就是force 的意思,强制删除。
    -i  :  交互式删除。
    -r  :  对目录进行递归删除。
    
    

    mv 移动文件与目录,或重命名

    选项
    -f  : 强制移动而不询问 
    -i   :交互式   
    -u  :若目标文件已经存在,且源文件比较新,才会更新  
    
    

    扩展:
    其实Linux中还有一个专门进行大量文件重命名的命令 rename,可以man rename查看一下。

    获取一个路径的,文件名部分与目录部分

    basename 获取文件名部分
    dirname 获取目录部分

    例如:

    [root@linux~]#basename   /etc/sysconfig/network
    network          文件名
    [root@linux~]#dirname    /etc/sysconfig/network
    /etc/sysconfig   目录名
    
    

    查看文件内容

    head 查看文件的前几行

    默认显示前 10 行

    选项:
    -n :后面接数字,表示显示前几行的意思
    
    

    tail 显示文件的后几行

    选项:
    -n  :  后面接数字
    默认后10行
    
    

    cat (concatenate)连续的简写,查看文件的全部内容

    主要功能是将一个文件的内容连续的显示 在屏幕上。
    当文件内容行数超过40行以上时,不适合用此命令。

    注意

    由于 cat 命令会把文件的所有内容都显示到屏幕上,换句话说,就是会把文件的内容一次性的读到内存中。
    这样的话,大的文件会把内存占满,从而导致整个系统崩溃。

    选项
    -n  :显示行号
    
    -A  :相当于-vET的整合参数,可列出一些特殊字符
    -E  :将结尾的换行符$显示出来
    -T  :  将[Tab]按键以^I显示出来
    -v  : 列出一些看不出来的特殊字符
    
    

    tac 倒序的显示文件的内容, 和 cat 相反

    cat     /etc/issue
    
    

    less 一页一页翻动,可以上下翻动

    [PageUP]向上,[PageDown]向下
    Less运行过程中
     空格键:     向下翻动一页
     [PageUP]: 向下翻动一页
     [pageDn]:向上翻动一页
    
     /字符串:  向下搜索字符串的功能
     ?字符串:想上搜索字符串的功能
     n:  重复前一个搜索(与/或?有关)
     N: 反向重复前一个搜索(与/或?有关)
     q:   离开less
    
    

    more 一页一页翻动

       当more运行过程中,可以操作的按键有:
      空格键:表示向下翻一页
      Enter:  表示向下翻一行
      /字符串:表示在这个显示的内容中,向下搜索字符串,之后按n,可重复向下搜索。
      :f :    立刻显示文件名以及当前 显示的行数
      q  :    表示立刻离开more
    
    

    touch [-acdmt] 文件

    选项:
    -a :仅修改access time
    -c :就是文件不存在不建立,存在则修改所以时间为当前时间戳
    -d :后面可以接日期,修改的是 atime 和 mtime
    -m:仅修改 mtime
    -t :后面可以接时间,格式为 [[CC]YY]MMDDhhmm[.ss]
    
    

    关于 Linu 系统中的 3 个时间

    atime 就是 access time 最近访问内容的时间
    mtime 就是 modify time 最近修改内容的时间
    ctime 就是 change time 最近更改文件的时间,包括文件名、大小、内容、权限、属主、属组等。

    stat 命令可以查看一个文档的这三个时间戳:

    stat anaconda-ks.cfg
    
    
    ➜  ~ stat anaconda-ks.cfg
      File: ‘anaconda-ks.cfg’
      Size: 3415        Blocks: 8          IO Block: 4096   regular file
    Device: 801h/2049d  Inode: 268680      Links: 1
    Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2019-03-05 17:36:56.000000000 +0000
    Modify: 2019-03-05 17:36:56.000000000 +0000
    Change: 2019-03-19 10:04:45.376427000 +0000
     Birth: -
    ➜  ~ touch -a anaconda-ks.cfg
    ➜  ~ stat anaconda-ks.cfg
      File: ‘anaconda-ks.cfg’
      Size: 3415        Blocks: 8          IO Block: 4096   regular file
    Device: 801h/2049d  Inode: 3564617     Links: 1
    Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2019-07-24 15:18:31.298567000 +0000
    Modify: 2019-03-05 17:36:56.000000000 +0000
    Change: 2019-07-24 15:18:31.298567000 +0000
     Birth: -
    ➜  ~ touch -c anaconda-ks.cfg
    ➜  ~ stat anaconda-ks.cfg
      File: ‘anaconda-ks.cfg’
      Size: 3415        Blocks: 8          IO Block: 4096   regular file
    Device: 801h/2049d  Inode: 3564617     Links: 1
    Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2019-07-24 15:19:33.401400000 +0000
    Modify: 2019-07-24 15:19:33.401400000 +0000
    Change: 2019-07-24 15:19:33.401400000 +0000
     Birth: -
    
    

    修改更精确的时间

    2018 年 8 月 7 日 18 点 18 分
    ➜  ~ touch -t 1808071818 anaconda-ks.cfg
    
    1918 年 8 月 7 日 18 点 18 分
    ➜  ~ touch -t 191808071818 anaconda-ks.cfg
    
    

    搜索文件

    which 寻找可执行文件

    参数:
    -a     :将所有可找到的同名命令都列出来。默认是只列出第一个找到的命令名称
    
    

    一文件查找

    grep: 文件内容过滤

    find: 文件查找,针对文件名

    1.1 命令文件

    which ls
    //从PATH环境变量 (echo $PATH)
    
    

    二 find详解

    find [options][path...] [expression][action】

    2.1按文件名:

    find /etc -name "ifcfg-eth0"  
    -name   文件名, 后面-print 动作时默认的,已省略
    
    find /etc -iname "ifcfg-eth0"           
    -i忽略大小写
    
    find /etc -iname "ifcfg-eth*"
    
    

    2.2按文件大小:

    find /etc -size +5M           //大于5M
    find /etc -size 5M
    find /etc -size -5M
    find /etc -size +5M -ls      //-ls找到的处理动作, 不是平时用的ls
    ll - h   查看大小
    
    

    2.3指定查找的目录深度:

    -maxdepth levels
    -mindepth levels
    find / -maxdepth 3 -a  -name "ifcfg-eth0"           maxdepth 3   最大3层    
    a要满足2个条件 
    并且按时间找(atime,mtime,ctime):
    [root@tianyun ~]# find /etc -mtime +5       //修改时间超过5天
    [root@tianyun ~]# find /etc -mtime 5        //修改时间等于5天
    [root@tianyun ~]# find /etc -mtime -5       //修改时间5天以内
    
    

    2.4按文件类型:

    find /dev -type f                          //f普通
    find /dev -type d                          //d目录
    find /dev -type l                          //l链接
    find /dev -type b                          //b块设备
    find /dev -type c                          //c字符设备
    find /dev -type s                          //s套接字
    find /dev -type p                          //p管道文件  
    
    

    2.5按文件权限:

    find . -perm 644 -ls            
    
    . 是当前目录    精确查找  644    一般都是进行精确查找
    
    find . -perm -644 -ls    
    -是包含的意思 
    带不带- 自己对比一下查看。       
    带-表示只要6就可以
    find . -perm -600 -ls
    find . -perm -222 -ls              //全局可写
    find /usr/bin /usr/sbin -perm -4000 -ls       //包含set uid
    find /usr/bin /usr/sbin -perm -2000 -ls       //包含set gid
    find /usr/bin /usr/sbin -perm -1000 -ls       //包含sticky    
    
    

    找到后处理的动作 ACTIONS:

    -print  默认
    -ls    列出结果文件的属性,就像 ls  -l 的效果
    
    -exec  继续执行其他命令
    |xargs  支持更多参数
    
    
    find /etc -name "ifcfg*" -exec cp -rvf {} /tmp \; 
    
    

    exec为执行一条shell命令 {}为前面的东西; 格式

    exec 命令用于调用并执行指令的命令 查找带 root 带文件 复制到 tmp

    find /etc -name “root*”  -exec cp -rf {} /tmp \;  
    
    
    find /etc -name "ifcfg*" -exec rm -rf {} \;  
    
    
    find . -name "a*" -delete 
    
    

    扩展知识:find结合xargs*

     find . -name "yang*.txt" |xargs rm -rf     
    
    

    重点:

    找到之后删除处理

    xargs 把找到的文件名作为参数传递个要处理的程序

    案例1: 分别找出file5 和除了file5的文件

    [root@tianyun ~]# mkdir dir1
    [root@tianyun ~]# touch dir1/file{1..20}
    
    [root@tianyun ~]# find /root/dir1 -name "file5"
    [root@tianyun ~]# find /root/dir1 ! -name "file5" 
    !为取反
    [root@tianyun ~]# find /root/dir1 -name "file5" -o -name "file9"         
    即是file5又是file9
    
    /root/dir1/file5
    /root/dir1/file9
    
    

    三 -exec 和 xargs 的区别

    find . -name 'core' -type f -exec rm {} /; 时,

    find -exec 命令会对每个匹配的文件执行一个单独的 rm 操作(execute a separate rm for each one), 正如你手动敲入下面命令:

    rm ./bin/core
    
    rm ./source/shopping_cart/core
    
    rm ./backups/core
    
    

    但是使用这种方式,如果有100个文件匹配了,那么就需要启100个进程,一个进程处理一个rm命令。一般来说,其越多进程,意味着越耗性能。我们可以换个思路,我们将要删除文件当作参数传递给rm不就可以了吗?也就是说

    rm ./bin/core
    
    rm ./source/shopping_cart/core 
    
    rm ./backups/core
    
    

    改成:

     rm ./bin/core ./source/shopping_cart/core ./backups/core
    
    

    但是前提是后面的命令必须支持多参数。

    像有些命令,比如unzip,就不支持输入多个jar包,所以必须用-exec。

    xargs,顾名思义,是对参数进行处理的命令。它的任务就是将输入行转换成下一个命令的参数列表。因此上面的

    find -exec命令可以改写成:

    find . -name 'core' -type f -print | xargs rm
    
    

    相比之下,也不难看出各自的缺点

    1、exec 每处理一个文件或者目录,它都需要启动一次命令,效率不好;

    2、exec 格式麻烦,必须用 {} 做文件的代位符,必须用 \;作为命令的结束符,书写不便。

    3、xargs 不能操作文件名有空格的文件; 综上,如果要使用的命令支持一次处理多个文件,并且也知道这些文件里没有带空格的文件, 那么使用 xargs比较方便; 否则,就要用 exec了。

    语法:

    xargs [-epn] command

    选项
    
    -e 后面跟字符串,当xargs分析到字符串时就停止,格式为 -e'test' 中间没有空格,这里的字符串必须和参数完全匹配
    -p 执行时询问
    -n 后面接数字,定义command执行时,要使用几个参数
    
    
    1. 找出 /sbin 目录下的文档,并使用 ls -l 列出详细数据
    find /sbin -perm +0700 |ls -l $(xargs) 
    
    
    1. 把找到的文件复制到 /test 目录下
    find /sbin -perm +0700 | cp $(xargs) /test
    
    

    关于减号 - 的用途

    可以作为 stdout 和 stdin

    tar  -cvf   -   /home | tar -xvf  - 
    
    

    二、目录管理

    1. 系统的目录树机构详解

    image

    / 根目录
    ├── bin 存放用户二进制文件
    ├── boot 存放内核引导配置文件
    ├── dev 存放设备文件
    ├── etc 存放系统配置文件
    ├── home 用户主目录
    ├── lib 动态共享库
    ├── lost+found 文件系统恢复时的恢复文件
    ├── media 可卸载存储介质挂载点
    ├── mnt 文件系统临时挂载点
    ├── opt 附加的应用程序包
    ├── proc 系统内存的映射目录,提供内核与进程信息
    ├── root root 用户主目录
    ├── sbin 存放系统二进制文件
    ├── srv 存放服务相关数据
    ├── sys sys 虚拟文件系统挂载点
    ├── tmp 存放临时文件
    ├── usr 存放用户应用程序
    └── var 存放邮件、系统日志等变化文件

    2. 符号和目录的关系

    .   英文的点,表示当前目录

    ..   英文的点点, 表示上层目录

    -   英文的短横线, 表示上次离开的目录

    ~  英文的波浪号,表示 当前 用户的家目录

    ~shark   表示 shark 用户的家目录


    3. 操作目录的命令

    pwd (print working directory) 显示当前所在目录的路径

    参数:
    -P 显示出实际路径,而非使用的软连接(link)路径

    cd (change directory) 你想去哪里

    例如:

    cd  ~               到自己的家目录
    cd  ~shark        到  shark 用户的家目录
    cd  -              到上次离开的工作目录
    
    

    mkdir (make directory) 建立新目录

    参数:
    -m 创建新目录的同时,设置该目录的权限。直接设置,会忽略默认权限。
    -p 直接建立所需的目录递归。

    例如:

    mkdir   -p   /a/b/c
    
    

    rmdir (rmove directory) 删除空目录

    参数:
    -p 递归删除空目录

    tree 递归查看目录结构

    参数:
    -L n 表示查看到第 n 层的目录

    三、文件内容操作

    cut 字段分隔

    image image image

    grep 关键字搜索

    grep [-acinv] [--color=auto] '搜寻字符串' filename
    选项:
    -a //将binary 文件以text文件的方式搜索数据
    -c //计算找到的字符串的次数
    -i //忽略大小写
    -n //输出行号
    -v //反向选择

    排序、统计命令: sort wc uniq

    sort 排序

    可以依据不同的数据型态来排序

    sort [-fbMnrtuk] [file or stdin]
    选项不参数:
    -f :忽略大小写
    -b :忽略最前面的空格符部分;
    -n : 使用『纯数字』进行排序(默认是以文字型态来排序的);
    -r :反向排序;
    -u :就是 uniq ,相同的数据中,仅出现一行代表;
    -t :分隔符,预设是用 [tab] 键来分隔;
    -k :以那个区间 (field) 来进行排序的意思

    示例文件内容

    4349 shark
    264 shark
    924 xiguatian
    924 tian
    734 yangge
    823 shark
    734 yangge
    
    
    sortt     sort.txt
    
    sort    -n  sort.txt
    
    

    uniq 去重+统计数量

    可以将重复的数据仅列出一个来显示,且可以进行统计

    uniq [-ic]
    选项:
    -i   //忽略大小写
    -c   //进行统计

    例如:我想要知道每个人登入服务器的总次数,可以这样:

    [root@testhost ~]# last  | cut   -d   ' '  -f1  |sort|uniq   -c
    
    

    wc 字符、行统计

    image

    tr 字符替换

    cat /etc/passwd | tr -d ':' //将冒号删除
    
    last | tr '[a-z]' '[A-Z]' //所有小写变成大写
    
    

    tee 双向输出

    image
    cat   anaconda-ks.cfg   | tee  an.bak  
    

    相关文章

      网友评论

          本文标题:5.文档管理

          本文链接:https://www.haomeiwen.com/subject/psbtwctx.html