目录
Linux常用命令
一 ,文件与目录的创建与删除
1.文件与目录的创建
1)touch在当前目录下创建文件
touch 命令不光可以用来创建文件(当指定操作文件不存在时,该命令会在当前位置建立一个空文件),此命令更重要的功能是修改文件的时间参数(当文件存在时,会修改此文件的时间参数)。 Linux 系统中,每个文件主要拥有 3 个时间参数(通过 stat 命令进行查看),分别是文件的访问时间、数据修改时间以及状态修改时间: 访问时间(Access Time,简称 atime):只要文件的内容被读取,访问时间就会更新。例如,使用 cat 命令可以查看文件的内容,此时文件的访问时间就会发生改变。 数据修改时间(Modify Time,简称 mtime):当文件的内容数据发生改变,此文件的数据修改时间就会跟着相应改变。 状态修改时间(Change Time,简称 ctime):当文件的状态发生变化,就会相应改变这个时间。比如说,如果文件的权限或者属性发生改变,此时间就会相应改变。
touch 命令的基本格式如下:
[root@localhost ~]# touch [选项] 文件名
选项:
-a:只修改文件的访问时间;
-c:仅修改文件的时间参数(3 个时间参数都改变),如果文件不存在,则不建立新文件。
-d:后面可以跟欲修订的日期,而不用当前的日期,即把文件的 atime 和 mtime 时间改为指定的时间。
-m:只修改文件的数据修改时间。
-t:命令后面可以跟欲修订的时间,而不用目前的时间,时间书写格式为 YYMMDDhhmm。
当对已经创建的文件使用touch时,默认修改文件的访问时间
2)mkdir创建目录
操作 | 功能 |
---|---|
mkdir dir1 | 创建一个叫做 ‘dir1’ 的目录’ |
mkdir dir1 dir2 | 同时创建两个目录 |
mkdir -p /tmp/dir1/dir2 | 创建一个目录树 |
mkdir -m | 创建文件夹模式(读/写) |
2.文件与目录的删除
文件的删除:
rm [options] name...
options:
-
-i 删除前逐一询问确认。
-
-f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
-
-r 将目录及以下之档案亦逐一删除。
目录的删除:
rmdir [-p] dirName
options:
-
-p 是当子目录被删除后使它也成为空目录的话,则顺便一并删除。
二,路径的改变与当前目录的查看
1.路径的改变
操作 | 功能 |
---|---|
cd | 进入个人的主目录 |
cd ~user1 | 进入个人的主目录 |
cd /home | 进入 ‘/ home’ 目录’ |
cd … | 返回上一级目录 |
cd …/… | 返回上两级目录 |
cd - | 返回上次所在的目录 |
pwd | 显示工作路径 |
2.当前目录的查看
操作 | 功能 |
---|---|
ls | 查看目录中的文件 |
ls -F | 查看目录中的文件 |
ls -l | 显示文件和目录的详细资料 |
ls -a | 显示隐藏文件 |
ls -R | 递归显示当前目录下包含的子文件 |
三,文件与目录的移动与拷贝
1.文件与目录的移动
mv [options] source dest
mv [options] source... directory
options:
针对目标文件或目录存在时作相关讨论
-
-b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。
-
-i: 如果指定移动的源目录或文件与目标的目录或文件同名,则会先询问是否覆盖旧文件,输入 y 表示直接覆盖,输入 n 表示取消该操作。
-
-f: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件。
-
-n: 不要覆盖任何已存在的文件或目录。
-
-u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。
命令格式 | 运行结果 |
---|---|
mv source_file(文件) dest_file(文件) | 将源文件名 source_file 改为目标文件名 dest_file |
mv source_file(文件) dest_directory(目录) | 将文件 source_file 移动到目标目录 dest_directory 中 |
mv source_directory(目录) dest_directory(目录) | 目录名 dest_directory 已存在,将 source_directory 移动到目录名 dest_directory 中;目录名 dest_directory 不存在则 source_directory 改名为目录名 dest_directory |
2.文件与目录的拷贝
cp [options] source dest
cp [options] source... directory
options:
-
-a:相当于 -d、-p、-r 选项的集合,这几个选项我们一一介绍;
-
-d:如果源文件为软链接(对硬链接无效),则复制出的目标文件也为软链接;
-
-i:询问,如果目标文件已经存在,则会询问是否覆盖;
-
-l:把目标文件建立为源文件的硬链接文件,而不是复制源文件;
-
-s:把目标文件建立为源文件的软链接文件,而不是复制源文件;
-
-p:复制后目标文件保留源文件的属性(包括所有者、所属组、权限和时间);
-
-r:递归复制,用于复制目录;
-
-u:若目标文件比源文件有差异,则使用该选项可以更新目标文件,此选项可用于对文件的升级和备用。
1)文件的复制
[root@localhost ~]# touch cangls
#建立源文件
[root@localhost ~]# cp cangls tmp
#把源文件不改名复制到 tmp 目录下
如果需要改名复制,则命令如下:
[root@localhost ~]# cp cangls tmp/bols
#改名复制
如果复制的目标位置已经存在同名的文件,则会提示是否覆盖,因为 cp 命令默认执行的是“cp -i”的别名
2)目录的复制
[root@localhost ~]# mkdir movie
#建立测试目录
[root@localhost ~]# cp -r root/movie tmp
#目录原名复制
3)保留源文件属性复制
我们发现,在执行复制命令后,目标文件的时间会变成复制命令的执行时间,而不是源文件的时间。而当我们执行备份、曰志备份的时候,这些文件的时间可能是一个重要的参数,这就需执行 "-p" 选项了。这个选项会保留源文件的属性,包括所有者、所属组和时间。
4)"-l"和"-s"选项
我们如果使用 "-l" 选项,则目标文件会被建立为源文件的硬链接;而如果使用了 "-s" 选项,则目标文件会被建立为源文件的软链接。
这两个选项和 "-d" 选项是不同的,"d" 选项要求源文件必须是软链接,目标文件才会复制为软链接;而 "-l" 和 "-s" 选项的源文件只需是普通文件,目标文件就可以直接复制为硬链接和软链接。
四,文件的搜索与查看
1.文件的搜索
find path -option [-print ] [-exec -ok command ] {} \;
-print:将查找到的文件输出到标准输出 -exec command {} \; 将查找的文件执行command操作({}和\之间有空格,;必须加上)
-ok与exec相同,不过在操作之前要询问用户
options:
-
-mount, -xdev : 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件
-
-amin n : 在过去 n 分钟内被读取过
-
-anewer file : 比文件 file 更晚被读取过的文件
-
-atime n : 在过去n天内被读取过的文件
-
-cmin n : 在过去 n 分钟内被修改过
-
-cnewer file :比文件 file 更新的文件
-
-ctime n : 在过去n天内被修改过的文件
-
-empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name
-
-ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写
-
-name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写
-
-size n : 文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。
-
-type c : 文件类型是 c 的文件。
-
d: 目录
-
c: 字型装置文件
-
b: 区块装置文件
-
p: 具名贮列
-
f: 一般文件
-
l: 符号连结
-
s: socket
-
将当前目录及其子目录中的所有文件列出: # find . -type f 查找 /var/log 目录中更改时间在 7 日以前的普通文件,并在删除之前询问它们: # find /var/log -type f -mtime +7 -ok rm {} \;
2.文件的查看
操作 | 功能 |
---|---|
cat -s test.c | 终端多个空行合并成一个空行显示test.c内容 |
cat -b test.c | 终端加行号显示test.c内容 |
nl test.c | 查看文件直接显示行号 |
head test.c | 默认显示前10行内容 |
head -n test.c | 显示前N行内容 |
tail test.c | 默认显示后10行内容 |
tatil -n test.c | 显示后N行内容 |
tac test.c | 从最后一行开始反向查看文件内容 |
more test.c | 正向查看一个长文件的内容 |
less test.c | 反向查看 |
df -T | 打印文件系统类型 |
五,权限命令
Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。
只有文件所有者和超级用户可以修改文件或目录的权限。可以使用绝对模式(八进制数字模式),符号模式指定文件的权限。
chmod [-cfvR] [--help] [--version] mode file...
mode:权限字符串,格式如下:
[ugoa...][[+-=][rwxX]...][,...]
可以设置多个项目,每个项目的设置以逗号隔开
-
u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
-
+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
-
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
options:
-
-c : 若该文件权限确实已经更改,才显示其更改动作
-
-f : 若该文件权限无法被更改也不要显示错误讯息
-
-v : 显示权限变更的详细资料
-
-R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
-
--help : 显示辅助说明
-
--version : 显示版本
六,创建文件链接-ln
链接也分软硬
我们先来介绍一下软链接和硬链接的概念。
软链接,全称是软链接文件,英文叫作 symbolic link。这类文件其实非常类似于 Windows 里的快捷方式,这个软链接文件(假设叫 VA)的内容,其实是另外一个文件(假设叫 B)的路径和名称,当打开 A 文件时,实际上系统会根据其内容找到并打开 B 文件。
而硬链接,全称叫作硬链接文件,英文名称是 hard link。这类文件比较特殊,这类文件(假设叫 A)会拥有自己的 inode 节点和名称,其 inode 会指向文件内容所在的数据块。与此同时,该文件内容所在的数据块的引用计数会加 1。当此数据块的引用计数大于等于 2 时,则表示有多个文件同时指向了这一数据块。一个文件修改,多个文件都会生效。当删除其中某个文件时,对另一个文件不会有影响,仅仅是数据块的引用计数减 1。当引用计数为 0 时,则系统才会清除此数据块。
个人理解为:软链接是指将某个文件的路径和名称存在另一个文件中,而这个文件就叫做软链接,系统会自己根据路径和名称找到文件。而硬链接相当于是一个指针,直接指向该文件内容所在的内存数据块。
ln [参数][源文件或目录][目标文件或目录] 默认创建硬链接 ln -s创建软链接
options:
-
b 删除,覆盖以前建立的链接
-
-d 允许超级用户制作目录的硬链接
-
-f 强制执行
-
-i 交互模式,文件存在则提示用户是否覆盖
-
-n 把符号链接视为一般目录
-
-s 软链接(符号链接)
-
-v 显示详细的处理过程
可以为文件创建硬链接和软链接,只能为目录创建软连接
为什么 ln 不允许硬链接到目录
Linux 系统中的硬链接有两个限制:
不能跨越文件系统。
不允许普通用户对目录作硬链接。
至于第一个限制,很好理解,而第二个就不那么好理解了。
我们对任何一个目录用 ls-l 命令都可以看到其链接数至少是 2,这也说明了系统中是存在基于目录的硬链接的,而且命令 ln-d(-d选项表示针对目录建立硬链接)也允许 root 用户尝试对目录作硬链接。这些都说明了系统限制对目录进行硬链接只是一个硬性规定,并不是逻辑上不允许或技术上不可行。那么操作系统为什么要进行这个限制呢?
这是因为,如果引入了对目录的硬连接就有可能在目录中引入循环链接,那么在目录遍历的时候系统就会陷入无限循环当中。也许有人会说,符号连接不也可以引入循环链接吗,那么为什么不限制目录的符号连接呢?
原因就在于,在 Linux 系统中,每个文件(目录也是文件)都对应着一个 inode 结构,其中 inode 数据结构中包含了文件类型(目录、普通文件、符号连接文件等)的信息,也就是说,操作系统在遍历目录时可以判断出其是否是符号连接。既然可以判断出它是否是符号连接,当然就可以采取一些措施来防范进入过大过深的循环层次,于是大部分系统会规定在连续遇到 8 个符号连接后就停止遍历。但是对于硬链接,由于操作系统中采用的数据结构和算法限制,目前是不能防范这种死循环的。
基于这样的考虑,系统不允许普通用户建立目录硬链接。