5.文档管理

一、文件管理

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.文档管理)