一、文件管理
Linux 系统中有 一切皆文件 的说法。
文件是文件
硬件设备也是文件
就是在 Linux 中管理计算机的任何资源都是使用文件的。
这些资源可以是:
具体的文件和目录
键盘、鼠标、网卡、主板、CPU、硬盘等。
1. 关于对文件的操作命令
touch 创建一个空的普通文件
touch file # 创建一个名为 file 的空文件
cp 复制文件或目录
cp [选项] 文件1 文件2 ... 目标路径
若源文件有两个以上,则最后一个目标文件一定是目录。
选项
-a : 相当于-pdr的意思。可将文件的所有属性一起复制,可对目录递归操作。
-p : 与文件的属性一起复制,而非使用默认属性。
-d : 若源文件为链接文件,则复制连接文件而非文件本身。
-r : 递归复制,用于目录的复制操作。
-f : 若目标目录中含有和源文件同名的文件,强制(force)复制,不提示确认。
-i : 若目标文件已存在,则提示。
-l : 建立硬链接(hard link)的连接文件,而非复制文件本身。
-u : 若目标文件比源文件旧,更新目标文件。
示例
- 复制
a.txt
文件, 到/tmp
目录中
cp a.txt /tmp/
- 复制
b.txt
文件, 到/tmp
目录下,并起名为b.txt.bak
cp b.txt /tmp/b.txt.bak
- 复制
/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执行时,要使用几个参数
- 找出 /sbin 目录下的文档,并使用 ls -l 列出详细数据
find /sbin -perm +0700 |ls -l $(xargs)
- 把找到的文件复制到 /test 目录下
find /sbin -perm +0700 | cp $(xargs) /test
关于减号 - 的用途
可以作为 stdout 和 stdin
tar -cvf - /home | tar -xvf -
二、目录管理
1. 系统的目录树机构详解
/ 根目录
├── 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 字段分隔
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 字符、行统计
tr 字符替换
cat /etc/passwd | tr -d ':' //将冒号删除
last | tr '[a-z]' '[A-Z]' //所有小写变成大写
tee 双向输出
cat anaconda-ks.cfg | tee an.bak