本篇文章没有太多理解性的东西,主要是记录有关于文件和目录的各种常用命令使用方法。
熟悉Linux
基础命令的请略过~~
Linux
的目录结构就是一颗枝繁叶茂的树,根目录/
就是这颗树的根。
寻找目录的过程就是沿着树节点移动。移动方法有两种:
.
为起点,移动到目标节点的路径/
为起点,移动到目标节点的路径为了简化切换操作,Linux
设置了几个比较特殊的目录:
. 代表当前所在目录
.. 代表上一层的父目录
- 代表前一个工作目录
~ 代表当前用户的家目录
~git 代表git用户的家目录
假设以git
用户身份登陆系统进入家目录/home/git
,然后顺序执行以下cd
命令:
语法: cd [相对路径或绝对路径]
全称: Change Directory
[root@www ~] cd . # 还是在 /home/git 目录,这样执行cd命令其实没什么意义
[root@www ~] cd .. # 切换到上一层目录 /home
[root@www ~] cd - # 切换回上一个目录 /home/git
[root@www ~] cd ~vip # 切换到vip用户家目录 /home/vip
[root@www ~] cd ~ # 切换到当前用户家目录 /home/git
[root@www ~] cd book # 相对路径,切换到当前目录的子目录 /home/vip/book
[root@www ~] cd /home/vip/book # 绝对路径,直接切换到目录 /home/vip/book
语法: pwd [-P]
全称: Print Working Directory
参数:
-P : 显示实际路径,而非连接(link)路径
# 使用 ls 查看目录 /var/mail 属性,发现这是个连接目录,指向的实际目录 /var/spool/mail
lrwxrwxrwx 1 root root 10 8月 14 2019 mail -> spool/mail
# 在 /var/mail 目录下执行命令
[root@www ~] pwd # 显示当前目录 /var/mail
[root@www ~] pwd -P # 显示实际目录 /var/spool/mail
语法: mkdir [-mp] 目录名称
参数:
-m : 配置目录的权限,直接设置,不需要看默认权限(umask)
-p : 递归创建多级目录
示例:
[root@www ~] mkdir test # 创建一个名为test的新目录,默认权限
[root@www ~] mkdir -m 711 test # 创建权限为rwx--x--x的新目录
[root@www ~] mkdir -p test1/test2/test3/test4 # 创建四级目录
空目录的意思是目录中不存在文件或者子目录。
语法: rmdir [-p] 目录名称
参数:
-p : 连同上层空目录一起删除
示例:
[root@www ~] rmdir test # 可直接删除空目录,不是空目录的话不能删除,命令会报错
[root@www ~] rmdir -p test1/test2/test3/test4 # 如果都是空目录,可以一起删除
列举出某个目录中包括的文件及子目录。
这个命令参数挺多,但每个人常用的形式就那么一两种,不用都记,用习惯了就好。
语法: ls [-aAdfFhilnrRSt] [目录名称,默认是当前目录]
参数:
-a : 列举全部文件,连同隐藏文件及目录,默认不会列举隐藏文件及目录
-A : 列举全部文件,连同隐藏文件及目录,但是不包括 . 与 .. 这两个目录
-d : 仅列举目录本身,不包含目录中的文件及子目录
-f : 直接列举结果,不进行排序,默认会以文件名排序展示
-F : 根据文件、目录等信息给予附加数据结构,例如*代表可执行文件,/代表目录,=代表socket文件,|代表FIFO文件
-h : 以人类较易读的方式列举出文件容量,例如GB,KB等
-i : 列出inode号码
-l : 列出更为详细的信息,包括文件属性和权限等
-n : 列出UID与GID,而非用户和用户组名称
-r : 排序结果反向输出
-R : 连同子目录内容一起列出,等于该目录及其子目录下所有的文件都会显示出来
-S : 以文件内容大小排序,而不是用文件名称
-t : 以时间排序,而不是用文件名称
--color=never : 不要依据文件特性给予颜色显示
--color=always : 显示颜色
--color=auto : 让系统自行依据设置来判断是否给予颜色
--full-time : 以完整时间模式输出,包含年月日时分
--time=[atime,ctime] : 输出访问时间(atime)或改变权限属性时间(ctime),而非内容变更时间(mtime)
示例:
[root@www ~] ls -al # 最最常用的命令,列举出当前目录下的文件及目录信息
[root@www ~] ls -al ~ # 列举当前用户家目录下的文件及目录
[root@www ~] ls -al -color=never ~ # 同上,不显示颜色,文件名称后面显示文件类型
[root@www ~] ls -al --full-time ~ # 显示完整的文件时间,默认是内容修改时间
复制操作会涉及到文件的属性和权限,因此在复制时,必须了解清楚几件事情:
语法:
cp [-adfilprsu] 源文件(source) 目标文件(destination)
# 如果源文件有两个以上,则最后一个目标文件一定要是“目录”才行
cp [options] source1 source2 source3 .... directory
参数:
-a : 相当于 -pdr 的意思
-d : 若源文件是连接文件属性(link file),则复制连接文件属性而非文件本身
-f : 强制(force)的意思,若目标文件已经存在且无法开启,则删除后再尝试一次
-i : 若目标文件已经存在,覆盖时先询问操作的进行
-l : 进行硬连接(hard link)的连接文件创建,而非复制文件本身
-p : 连同文件的属性一起复制,而非使用默认属性(备份常用)
-r : 递归复制,用于目录的复制行为
-s : 复制成为符号链接文件(symbolic link),即“快捷方式”文件
-u : 若目标文件比源文件旧才更新目标文件
# 不同的用户身份执行cp命令会有不同的结果,尤其是 -a -p 参数,不同身份区别很大
示例:
# 用 root 身份将主文件夹下的 .bashrc 复制到 /tmp 下,并改名为 bashrc
[root@www ~] cp ~/.bashrc /tmp/bashrc
[root@www ~] cp -i ~/.bashrc /tmp/bashrc # 第二次复制的时候,会询问操作是否进行
# 切换到 /tmp 目录,将 /var/log/wtmp 复制到 /tmp 且查看属性
[root@www ~] cp /var/log/wtmp . # 目标文件某些属性、权限、创建时间会发生变化
[root@www ~] cp -a /var/log/wtmp . # 目标文件和源文件特性都是一样的
# 复制 /etc 目录下的所有内容到 /tmp 下面
[root@www ~] cp -r /etc/ /tmp
# 创建硬连接(hard link)和软连接(symbolic link)
[root@www ~] cp -l bashrc bashrc_hlink # 硬连接
[root@www ~] cp -s bashrc bashrc_slink # 软连接,即“快捷方式”
# 复制连接文件(link file)
[root@www ~] cp bashrc_slink bashrc_slink_1 # bashrc_slink_1 与源文件相同
[root@www ~] cp -d bashrc_slink bashrc_slink_2 # bashrc_slink_2 是连接文件
# 若 ~/.bashrc 比 /tmp/bashrc 新才复制过来
[root@www ~] cp -u ~/.bashrc /tmp/bashrc # 也就是文件有新的差异才会复制,常用于备份
# 将多个数据一次复制到同一个目录中,最后的参数一定得是目录
[root@www ~] cp ~/.bashrc ~/.bash_history /tmp
语法: rm [-fir] 文件或目录
参数:
-f : 就是 force 的意思,忽略不存在的文件,不会出现警告信息
-i : 互动模式,在删除前会询问用户是否操作
-r : 递归删除,最常用的目录删除选项,也是非常危险的参数!
示例:
# 删除文件
[root@www ~] rm bashrc # 直接删除 bashrc 文件
[root@www ~] rm -i bashrc # 删除 bashrc 文件前会询问是否确定删除,有机会避免误删
[root@www ~] rm -i bashrc* # 根据通配符 * 删除文件名以 bashrc 开头的文件
[root@www ~] rm -r /tmp/etc # 删除目录 /tmp/etc 及其中的文件和子目录
语法:
mv [-fiu] source destination
mv [optins] source1 source2 source3 .... directory
参数:
-f : 强制force的意思,如果目标文件存在直接覆盖
-i : 如果目标文件存在,会询问是否覆盖
-u : 如果目标文件存在,且源文件比较新,才会覆盖
示例:
# source是文件,destination是目录
[root@www ~] mv file1 dir1 # 将文件 file1 移动到目录 dir1 中
[root@www ~] mv file1 file2 dir1 # 将文件 file1 和 file2 移动到目录 dir1 中
[root@www ~] mv file1 dir1 dir2 # 将文件 file1 和目录 dir1 移动到目录 dir2 中
# source是文件,destination也是文件
[root@www ~] mv myfile1 myfile2 # 将文件 myfile1 重命名为 myfile2
# source是目录,destination也是目录
[root@www ~] mv mydir1 mydir2 # 将目录 mydir1 重命名为 mydir2
理解这个命令,首先要清楚一个知识点,与文件相关的时间有三个:
通过touch
命令可以轻易修改mtime
和atime
时间,其中mtime
也是比较重要的一个时间,因为我们关心的是文件内容何时被修改了。
另外,ctime
是记录文件状态被改变的时间,常规的Linux
命令是不能改变这个时间的,暂时我还没发现能改变这个时间的办法。
语法: touch [-acdmt] 文件
参数:
-a : 设置访问时间atime
-c : 若文件不存在就不创建新文件,等同于使用 --no-create 参数
-m : 设置修改时间mtime
-d : 接想要修改的具体日期,也可以使用 --date="日期或时间"
-t : 接想要修改的具体时间,格式为[YYYYMMDDhhmm]
示例:
# 新建文件,默认的 atime, ctime, mtime 都为目前的时间
[root@www ~] touch myfile
# 将 .bashrc 复制成 bashrc,假设复制完全的属性,检查其日期
[root@www ~] mkdri tmp
[root@www tmp] cp -a ~/.bashrc bashrc
[root@www tmp] ls -l bashrc; ls -l --time=atime bashrc; ls -l --time=ctime bashrc
-rw-r--r-- 1 root root 194 8月 28 2017 bashrc
-rw-r--r-- 1 root root 194 11月 11 20:26 bashrc # 当前时间
-rw-r--r-- 1 root root 194 11月 11 20:26 bashrc # 当前时间
# 将 bashrc 文件的日期调整为两天前
[root@www tmp] touch -d "2 days ago" bashrc
[root@www tmp] ls -l bashrc; ls -l --time=atime bashrc; ls -l --time=ctime bashrc
-rw-r--r-- 1 root root 194 11月 9 20:34 bashrc # 当前时间2天前
-rw-r--r-- 1 root root 194 11月 9 20:34 bashrc # 当前时间2天前
-rw-r--r-- 1 root root 194 11月 11 20:34 bashrc # 当前时间
# 继续将 bashrc 文件日期调整为 2022/05/20 13:14
[root@www ~] touch -t 202205201314 bashrc
[root@www tmp] ls -l bashrc; ls -l --time=atime bashrc; ls -l --time=ctime bashrc
-rw-r--r-- 1 root root 194 5月 20 2022 bashrc
-rw-r--r-- 1 root root 194 5月 20 2022 bashrc
-rw-r--r-- 1 root root 194 11月 11 20:39 bashrc # 当前时间
这是一个简单判断文件格式的命令,可以知道某个文件的基本数据类型。
比如是ASCII
类型还是data
类型,又或者是binary
类型,且其中有没有使用到动态函数库share library
等信息。
语法: file 文件
示例:
# 查看 ~/.bashrc 文件,发现是个ASCII纯文本文件
[root@www ~] file ~/.bashrc
/root/.bashrc: ASCII text
# 查看执行文件,其中的信息就很多了,这里就不展开了
[root@www ~] file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=1e5735bf7b317e60bcb907f1989951f6abd50e8d, stripped
# 查看data文件
[root@www ~] file /var/lib/mlocate/mlocate.db
/var/lib/mlocate/mlocate.db: data
这个命令是专门用来寻找用户PATH
路径下的可执行文件的命令,也就是寻找命令存放在哪里的命令。
需要注意的是,不在用户PATH
路径下的命令,是找不到的。
语法: which [-a] command
参数:
-a : 将所有PATH目录中可以找到的命令都列举出来
示例:
# 寻找 ifconfig 命令
[root@www ~] which ifconfig
/usr/sbin/ifconfig
# 寻找 cp 命令,这个命令我是设置了alias的,所以显示稍有不一样
[root@www ~] which cp
alias cp='cp -i'
/usr/bin/cp
Linux
会将系统内的所有文件都记录在一个数据库文件/var/lib/mlocate
里面,whereis
和locate
命令都是基于这个数据库来检索文件的,所以效率上会快很多。
但是有时也会遇到一点点问题,比如说找到了已经删除的文件,或者找不到最新创建的文件,这是因为数据库还没有及时更新的原因。
不同的系统版本,数据库/var/lib/mlocate
更新的频率可能不一样,比较常见的频率是系统每天自动更新同步一次。等不及的话,也可以手动执行updatedb
命令去读取/etc/updatedb.conf
配置文件及时更新数据库,这个过程可能需要持续几分钟。
语法: whereis [-bmsu] 文件或目录名
参数:
-b : 只找二进制格式的文件
-m : 只找说明文件(manual路径下的文件)
-s : 只找source源文件
-u : 查找不在上述三个选项当中的其它特殊文件
示例:
# 查找 ifconfig 文件
[root@www ~] whereis ifconfig
ifconfig: /usr/sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
# 查找 passwd 可执行文件
[root@www ~] whereis -b passwd
passwd: /usr/bin/passwd /etc/passwd
# 查找 passwd 相关的"说明文件"(man page)
[root@www ~] whereis -m passwd
passwd: /usr/share/man/man1/passwd.1.gz
locate
和whereis
都是用于寻找文件的,区别是locate
是通过正则表达式来匹配寻找的,也可以理解为模糊查找方式。
语法: locate [-ir] keyword
参数:
-i : 忽略大小写的差异
-r : 后面可接正则表达式的显示方式
示例:
# 查找所有与 passwd 相关的文件名
[root@www ~] locate passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
....(下面省略很多文件)....
该命令寻找速度慢的原因是它直接从硬盘检索查找文件,如果硬盘比较老旧的话,寻找的时间就会更长。
但是它相对于whereis
和locate
的好处,就是查找的结果时效性更强。
语法: find [PATH] [option] [action]
# ---------- 使用方法,第一部分 ----------
参数:
1. 与时间(atime、ctime、mtime)有关的参数,以 mtime 为例
-mtime n : n为数字,查找n天之前的"一天之内"被更改过的文件
-mtime +n : 查找n天之前(不含n天本身)被更改过的文件名
-mtime -n : 查找n天之内(含n天本身)被更改过的文件名
-newer file : file表示一个存在的文件,查找比file还要新的文件名
示例:
# 查找过去24小时内根目录下有改动的文件
# 0 是重点!表示当前的时间,也就是从现在开始到24小时前
[root@www ~] find / -mtime 0
# 查找1天前的24小时内根目录下有改动的文件
[root@www ~] find / -mtime 1
# 查找3天内 /var 目录下有改动的文件
[root@www ~] find /var -mtime -3
# 时间参数的相关意义可以参照下图来理解: +4、4、-4
<--------- +4 ----------|-- 4 --|------------- -4 --------------|
<-------|-------|-------|-------|-------|-------|-------|-------|
(过去时) 7 6 5 4 3 2 1 0(现在)
# 查找 /etc 目录中文件,比 /etc/passwd 新的文件
[root@www ~] find /etc -newer /etc/passwd
# ---------- 使用方法,第二部分 ----------
参数:
2. 与用户或用户组名有关的参数:
-uid n : 数字n是用户的账号ID,即UID(文件/etc/passwd里与账号名称对应的数字)
-gid n : 数字n是用户组名的ID,即GID(文件/etc/group里记录)
-user name : name表示用户账号名称
-group name : name表示用户组名
-nouser : 寻找文件所有者不在/etc/passwd中记录的文件
-nogroup : 寻找文件用户组不在/etc/group中记录的文件
示例:
# 查找/home目录下属于用户alice的文件
[root@www ~] find /home -user alice
# 查找系统中不属于任何人的文件
[root@www ~] find / -nouser
# ---------- 使用方法,第三部分 ----------
参数:
3. 与文件权限和名称有关的参数
-name filename : 查找文件名为filename的文件
-size (+-)n[cwbkMG] : n是数字,[cwbkMG]是各种数据容量单位。查找比某个数据容量大(+)或小(-)的文件。
c : byte
w : 2byte(字)
b : 512byte(块,如果n后面不接单位,这就是默认的单位)
k : KB
M : MB
G : GB
-type TYPE : 查找文件类型为TYPE的文件,TYPE取值
b : 块设备文件
c : 字符设备文件
d : 目录
p : FIFO文件
f : 普通文件
l : 链接文件
s : 套接字文件
D : door (Solaris)
-perm mode : 查找文件权限"刚好等于"mode的文件,mode就是类似于chmod的属性值,例如-rwsr-xr-x属性值为4755
-perm -mode : 查找文件权限"全部包含"mode的文件
-perm +mode : 查找文件权限"包含任一"mode的文件
示例:
# 查找文件名为 passwd 的文件(常用)
[root@www ~] find / -name passwd
# 查找 /var 目录下文件类型为Socket的文件
[root@www ~] find /var -type s
# 查找文件当中含有SGID或SUID或SBIT属性的文件
[root@www ~] find / -perm +7000
# 查找/bin、/sbin目录下具有SUID(4分)或SGID(2分)的文件
[root@www ~] find /bin /sbin -perm +6000
# ---------- 使用方法,第四部分 ----------
参数:
4. 其它可进行的操作
-exec command : command为其它命令(不支持alias设置的命令别名),表示其后可接其它命令处理查找到的结果
-print : 将结果打印到屏幕上,这也是find命令的默认操作,无需理会
示例:
# 将查找结果使用 ls -l 列举出来
[root@www ~] find / -perm +7000 -exec ls -l {} \;
# {}代表find找到的内容
# -exec到\;中间的内容,代表后续要执行的命令
# 用\转义;是因为;在bash环境中有特殊意义
这个命令会显示文件的所有内容,如果文件行数过多,屏幕上的显示会刷的飞快,根本来不及看清楚前面的内容。
因此,这个命令适用于查看内容行数较少的文件。
语法: cat [-AbEnTv]
参数:
-A : 相当于 -vET 的整合参数,可列出一些特殊字符,而不是空白而已
-b : 列出行号,仅针对非空白行做行号显示,空白行不标行号
-E : 将结尾的断行字符 $ 显示出来
-n : 打印出行号,连同空白行也会有行号,与 -b 的参数不同
-T : 将[Tab] 按键以 ^I 显示出来
-v : 列出一些看不出来的特殊字符
示例:
# 查看/etc/issue文件内容
[root@www ~] cat /etc/issue
CentOS release 5.3 (Final)
Kernel \r on an \m
<!-- 这里有个空行 -->
# 查看/etc/issue文件内容,加上行号
[root@www ~] cat -n /etc/issue
1 CentOS release 5.3 (Final)
2 Kernel \r on an \m
3 <!-- 这里有个空行,显示行号 -->
这个命令刚好与cat
反向,相当于把文件内容按行号倒序展示,实用性并不是很强。
示例:
# 查看/etc/issue文件内容,加上行号
[root@www ~] tac /etc/issue
<!-- 这里有个空行 -->
Kernel \r on an \m
CentOS release 5.3 (Final)
语法: nl [-bnw] 文件
参数:
-b : 指定行号包含的方式,主要有两种
-b a : 表示不论是否为空行,也同样列出行号(类似 cat -n)
-b t : 如果有空行,空的那一行不要列出行号(默认值)
-n : 列出行号表示的方法,主要有三种
-n ln : 行号在屏幕的最左方显示
-n rn : 行号在自己字段的最右方显示,且不加 0
-n rz : 行号在自己字段的最右方显示,且加 0
-w : 行号字段占用的位数
示例:
# 显示/etc/issue的内容
[root@www ~]# nl /etc/issue
1 CentOS release 5.3 (Final)
2 Kernel \r on an \m
<!-- 这里有个空行,没显示行号 -->
[root@www ~]# nl -b a /etc/issue
1 CentOS release 5.3 (Final)
2 Kernel \r on an \m
3 <!-- 这里有个空行,显示行号 -->
适合文件内容多,需要从前到后一页一页(屏幕)的浏览
语法: more 文件
示例:
[root@www ~] more /etc/man.config
#
# Generated automatically from man.conf.in by the
# configure script
#
# man.conf from man-1.6d
.... (中间省略) ....
--More--(30%) <== 重点在这一行,光标会在这里继续等待命令,此时是没有退出more命令的
说明:
文件内容一屏显示不完时,最后一行的会显示一个百分比,表示当前显示内容占文件总内容的比例。
出现百分比的时候,也就意味着文件还有内容没有展示,此时还可以有几个选择:
1. 空格键(Space) : 向下翻一页
2. Enter : 向下滚动一行
3. /字符串 : 从当前显示内容开始,向下查询"字符串"内容
4. :f : 立刻显示出文件名以及目前显示的行数
5. b 或 [ctrl]-b : 往回翻页,这个只对文件游泳,对管道没用
6. q : 立刻退出more命令
作用和more
命令一样,但是比more
更强大,更灵活
语法: less 文件
示例:
[root@www ~] more /etc/man.config
#
# Generated automatically from man.conf.in by the
# configure script
#
# man.conf from man-1.6d
.... (中间省略) ....
:(光标或文件名) <== 这里会等待继续输入命令
说明:
less比more欠缺的是不会在最后一行显示文件内容展示的百分比;而且文件内容不多,一屏可显示完全时,也不会自动退出该命令,需要用户主动退出
当前状态下,可以继续的操作:
1. 空格键(Space) : 向下翻一页
2. [PageDown] : 向下翻一页
3. [PageUp] : 向上翻一页
4. /字符串 : 从当前显示内容开始,向下查询"字符串"内容
5. ?字符串 : 从当前显示内容开始,向上查询"字符串"内容
6. n : 向下继续查询(与/和?相关的操作)
7. N : 向上继续查询(与/和?相关的操作)
8. q : 立刻退出less命令
语法: head [-n number] 文件
参数:
-n : 后面接数字,代表显示几行的意思
示例:
[root@www ~] head /etc/man.config # 默认情况下显示前10行
[root@www ~] head -n 20 /etc/man.config # 指定显示前20行
[root@www ~] head -n -100 /etc/man.config # 文件最后100行不显示,前面的都显示
该命令含义即操作正好与head
命令前后相反。
语法: tail [-n number | -f] 文件
参数:
-n : 后面接数字,代表显示几行的意思
-f : 持续监听并显示文件追加的内容,按ctrl+c退出
示例:
tail /etc/man.config # 默认情况下显示最后10行
tail -n 20 /etc/man.config # 显示文件最后20行
tail -n +100 /etc/man.config # 文件前100行不显示,后面的都显示
tail -f /var/log/messages # 持续监听并显示文件内容,按ctrl+c退出