一、文件管理
Linux 系统中有 一切皆文件 的说法。
文件是文件
硬件设备也是文件
就是在 Linux 中管理计算机的任何资源都是使用文件的。
这些资源可以是:
具体的文件和目录
键盘、鼠标、网卡、主板、CPU、硬盘等。
1. 关于对文件的操作命令
touch 创建一个空的普通文件
touch file # 创建一个名为 file 的空文件
cp 复制文件或目录
cp [选项] 文件1 文件2 ... 目标路径
若源文件有两个以上,则最后一个目标文件一定是目录。
选项
-a : 相当于-pdr的意思。可将文件的所有属性一起复制,可对目录递归操作。
-p : 与文件的属性一起复制,而非使用默认属性。
-d : 若源文件为链接文件,则复制连接文件而非文件本身。
-r : 递归复制,用于目录的复制操作。
示例
- 复制 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 一页一页翻动
空格键:表示向下翻一页
Enter: 表示向下翻一行
/字符串:表示在这个显示的内容中,向下搜索字符串,之后按n,可重复向下搜索。
:f : 立刻显示文件名以及当前 显示的行数
q : 表示立刻离开more
touch [-acdmt] 文件
选项:
-a :仅修改access time
-c :仅修改时间,而不建立文件
-d :后面可以接日期,也可以使用 date=日期或时间
-m:仅修改mtime
-t :后面可以接时间,格式为 [YYMMDDhhmm]
例如:将范例的bashrc日期改为2010/5/11 19:53
[root@www tmp]# touch -t 1005111953 bashrc
Touch 命令最常用的情况是:
建立一个空文件
将某个文件日期修改问当前日期(mtime与atime)
关于 Linu 系统中的 3 个时间
atime 就是 access time 最近访问内容的时间
mtime 就是 modify time 最近修改内容的时间
ctime 就是 change time 最近更改文件的时间,包括文件名、大小、内容、权限、属主、属组等。
stat 命令可以查看一个文档的这三个时间戳:
stat 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. 系统的目录树机构详解
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