Linux常用命令之Linux文件目录管理
Linux 文件目录管理
关键词:cd
, ls
, pwd
, mkdir
, rmdir
, tree
, touch
, ln
, rename
, stat
, file
, chmod
, chown
, locate
, find
, cp
, scp
, mv
, rm
1. Linux 文件目录工作机制
1.1. Linux 目录结构
linux 目录结构是树形结构,其根目录是 / 。一张思维导图说明各个目录的作用:
以下是对这些目录的解释:
目录 | 解释 |
---|---|
/bin | bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 |
/boot | 这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。 |
/dev | dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。 |
/etc | etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。 |
/home | 用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve。 |
/lib | lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。 |
/lost+found | 这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。 |
/media | linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。 |
/mnt | 系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。 |
/opt | opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。 |
/proc | proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all |
/root | 该目录为系统管理员,也称作超级权限者的用户主目录。 |
/sbin | s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。 |
/selinux | 这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。 |
/srv | 该目录存放一些服务启动之后需要提取的数据。 |
/sys | 这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。 |
/tmp | tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。 |
/usr | usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。 |
/usr/bin | 系统用户使用的应用程序。 |
/usr/sbin | 超级用户使用的比较高级的管理程序和系统守护程序。 |
/usr/src | 内核源代码默认的放置目录。 |
/var | var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。 |
/run | 是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。 |
在 Linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。/etc
上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。/bin
, /sbin
, /usr/bin
, /usr/sbin
: 这是系统预设的执行文件的放置目录,比如 ls 就是在 /bin/ls 目录下的。
值得提出的是,/bin
,/usr/bin
是给系统用户使用的指令(除root外的通用户),而/sbin
, /usr/sbin
则是给 root 使用的指令。/var
这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在 /var/log 目录下,另外 mail 的预设放置也是在这里。
1.2. Linux 文件属性
Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。 在 Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组,如:
$ ls -l
total 64
dr-xr-xr-x 2 root root 4096 Dec 14 2012 bin
dr-xr-xr-x 4 root root 4096 Apr 19 2012 boot
实例中,bin 文件的第一个属性用 d
表示。d
在 Linux 中代表该文件是一个目录文件。 在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。
- 当为
d
则是目录 - 当为
-
则是文件; - 若是
l
则表示为链接文档(link file); - 若是
b
则表示为装置文件里面的可供储存的接口设备(可随机存取装置); - 若是
c
则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
接下来的字符中,以三个为一组,且均为rwx
的三个参数的组合。其中,r
代表可读(read)、w
代表可写(write)、x
代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 - 而已。
每个文件的属性由左边第一部分的 10 个字符来确定(如下图)。
从左至右用 0-9 这些数字来表示。
- 第 0 位确定文件类型
- 第 1-3 位确定属主(该文件的拥有者)拥有该文件的权限。
- 第 4-6 位确定属组(拥有者的同组用户)拥有该文件的权限。
- 第 7-9 位确定其他用户拥有该文件的权限。
- 第 1、4、7 位表示读权限,如果用"r"字符表示,则有读权限,如果用"-"字符表示,则没有读权限。
- 第 2、5、8 位表示写权限,如果用"w"字符表示,则有写权限,如果用"-"字符表示没有写权限。
- 第 3、6、9 位表示可执行权限,如果用"x"字符表示,则有执行权限,如果用"-"字符表示,则没有执行权限。
1.2.1. Linux 文件属主和属组
$ ls -l
total 64
dr-xr-xr-x 2 root root 4096 Dec 14 2012 bin
dr-xr-xr-x 4 root root 4096 Apr 19 2012 boot
- 对于文件来说,它都有一个特定的拥有者,也就是对该文件具有所有权的用户。
- 同时,在 Linux 系统中,用户是按组分类的,一个用户属于一个或多个组。
- 文件拥有者以外的用户又可以分为文件拥有者的同组用户和其他用户。
- 因此,Linux 系统按文件拥有者、文件拥有者同组用户和其他用户来规定了不同的文件访问权限。
- 在以上实例中,bin 文件是一个目录文件,属主和属组都为 root,属主有可读、可写、可执行的权限;与属主同组的其他用户有可读和可执行的权限;其他用户也有可读和可执行的权限。
2. Linux 文件目录管理要点
2.1. 目录管理
- 切换目录 - 使用
cd
- 查看目录信息 - 使用
ls
- 显示当前目录的绝对路径 - 使用
pwd
- 树状显示目录的内容 - 使用
tree
- 创建目录 - 使用
mkdir
- 删除目录 - 使用
rmdir
2.2. 文件管理
- 创建空文件 - 使用
touch
- 为文件创建连接 - 使用
ln
- 批量重命名 - 使用
rename
- 显示文件的详细信息 - 使用
stat
- 探测文件类型 - 使用
file
- 设置文件或目录的权限 - 使用
chmod
- 设置文件或目录的拥有者或所属群组 - 使用
chown
- 查找文件或目录 - 使用
locate
- 在指定目录下查找文件 - 使用
find
- 查找命令的绝对路径 - 使用
which
- 查找命令的程序、源代码等相关文件 - 使用
whereis
2.3. 文件和目录通用管理
- 复制文件或目录 - 使用
cp
- 复制文件或目录到远程服务器 - 使用
scp
- 移动文件或目录 - 使用
mv
- 删除文件或目录 - 使用
rm
3. 命令常见用法
3.1. cd命令 – 切换目录
cd命令是”change directory”中单词的首字母缩写,其英文释义是改变目录,所以该命令的功能是从当前目录切换到指定目录。
其中目录的路径可分为绝对路径和相对路径。若目录名称省略,则切换至使用者的用户目录(也就是刚登录时所在的目录)。
另外,“~”也表示为用户目录的意思,“.”则是表示目前所在的目录,“…”则表示当前目录位置的上一级目录。
语法格式:cd [参数] [目录名]
常用参数:
参数 | 解释 |
---|---|
-P | 如果切换的目标目录是一个符号链接,则直接切换到符号链接指向的目标目录 |
-L | 如果切换的目标目录是一个符号链接,则直接切换到符号链接名所在的目录 |
– | 仅使用”-“选项时,当前目录将被切换到环境变量”OLDPWD”对应值的目录 |
~ | 切换至当前用户目录 |
… | 切换至当前目录位置的上一级目录 |
参考实例
将当前工作目录切换到test目录,并使用pwd命令查看当前目录:
aaa@qq.com:~$ cd test
aaa@qq.com:~/test$ pwd
/home/hirak0/test
使用“cd ~ ”和“cd … ”命令进行目录的切换操作,并使用pwd命令查看当前目录:
注意:使用“cd ~ ”命令可以直接切换到当前用户目录,而“cd … ”是切换到上一级目录。
aaa@qq.com:~/test$ pwd
/home/hirak0/test
aaa@qq.com:~/test$ cd ~
aaa@qq.com:~$ pwd
/home/hirak0
aaa@qq.com:~$ cd test
aaa@qq.com:~/test$ cd ..
aaa@qq.com:~$ pwd
/home/hirak0
使用“cd …/…”命令返回上两级目录:
aaa@qq.com:~/test/test1/test2$ pwd
/home/hirak0/test/test1/test2
aaa@qq.com:~/test/test1/test2$ cd ../..
aaa@qq.com:~/test$ pwd
/home/hirak0/test
使用“cd”命令返回当前用户目录。“cd – ” 命令返回上一次所在目录:
aaa@qq.com:~/test/test1$ pwd
/home/hirak0/test/test1
aaa@qq.com:~/test/test1$ cd
aaa@qq.com:~$ pwd
/home/hirak0
aaa@qq.com:~$ cd /home/hirak0/test/test1/
aaa@qq.com:~/test/test1$ cd -
/home/hirak0
aaa@qq.com:~$ cd /home/hirak0/test/test1/
aaa@qq.com:~/test/test1$ cd --
aaa@qq.com:~$ pwd
/home/hirak0
3.2. ls命令 – 显示指定工作目录下的内容及属性信息
ls 命令是Linux下最常用的指令之一。ls命令为英文单词 list 的缩写,正如英文单词 list 的意思,其功能是列出指定目录下的内容及其相关属性信息。
默认状态下,ls命令会列出当前目录的内容。而带上参数后,我们可以用ls做更多的事情。作为最基础同时又是使用频率很高的命令,我们很有必要搞清楚ls命令的用法,那么接下来一起看看吧!
语法格式: ls [选项] [文件]
常用参数:
参数 | 解释 |
---|---|
-a | 显示所有文件及目录 (包括以“.”开头的隐藏文件) |
-l | 使用长格式列出文件及目录信息 |
-r | 将文件以相反次序显示(默认依英文字母次序) |
-t | 根据最后的修改时间排序 |
-A | 同 -a ,但不列出 “.” (当前目录) 及 “…” (父目录) |
-S | 根据文件大小排序 |
-R | 递归列出所有子目录 |
参考实例
列出所有文件(包括隐藏文件):
aaa@qq.com:~$ ls -a
列出文件的详细信息:
aaa@qq.com:~$ ls -l
列出根目录(/)下的所有目录:
aaa@qq.com:~$ ls /
列出当前工作目录下所有名称是 “s” 开头的文件 :
aaa@qq.com:~$ ls -ltr s*
列出 /bin 目录下的所有目录及文件的详细信息 :
aaa@qq.com:~$ ls -lR /bin
列出当前工作目录下所有文件及目录并以文件的大小进行排序 :
aaa@qq.com:~$ ls -AS
3.3. pwd命令 – 显示当前路径
pwd命令是“print working directory”中每个单词的首字母缩写,其功能正如所示单词一样,为打印工作目录,即显示当前工作目录的绝对路径。
在实际工作中,我们经常会在不同目录之间进行切换,为了防止“迷路”,我们可以使用pwd命令快速查看当前我们所在的目录路径。
语法格式: pwd [参数]
常用参数:
参数 | 解释 |
---|---|
-L | 显示逻辑路径 |
参考实例
查看当前工作目录路径:
aaa@qq.com:~$ pwd
/home/hirak0
3.4. mkdir命令 – 创建目录
mkdir命令是“make directories”的缩写,用来创建目录。
注意:默认状态下,如果要创建的目录已经存在,则提示已存在,而不会继续创建目录。 所以在创建目录时,应保证新建的目录与它所在目录下的文件没有重名。 mkdir命令还可以同时创建多个目录,是不是很强大呢?
语法格式 : mkdir [参数] [目录]
常用参数:
参数 | 解释 |
---|---|
-p | 递归创建多级目录 |
-m | 建立目录的同时设置目录的权限 |
-z | 设置安全上下文 |
-v | 显示目录的创建过程 |
参考实例
在工作目录下,建立一个名为 dir 的子目录:
aaa@qq.com:~$ mkdir dir
在目录/usr/hirak0下建立子目录dir,并且设置文件属主有读、写和执行权限,其他人无权访问
aaa@qq.com:~$ mkdir -m 700 /usr/hirak0/dir
同时创建子目录dir1,dir2,dir3:
aaa@qq.com:~$ mkdir dir1 dir2 dir3
递归创建目录:
aaa@qq.com:~$ mkdir -p hirak0/dir
3.5. rmdir命令 – 删除空目录
rmdir命令作用是删除空的目录,英文全称:“remove directory”。
注意:rmdir命令只能删除空目录。当要删除非空目录时,就要使用带有“-R”选项的rm命令。
rmdir命令的“-p”参数可以递归删除指定的多级目录,但是要求每个目录也必须是空目录。
语法格式 : rmdir [参数] [目录名称]
常用参数:
参数 | 解释 |
---|---|
-p | 用递归的方式删除指定的目录路径中的所有父级目录,非空则报错 |
– -- ignore-fail-on-non-empty | 忽略由于删除非空目录时导致命令出错而产生的错误信息 |
-v | 显示命令的详细执行过程 |
– -- help | 显示命令的帮助信息 |
– -- version | 显示命令的版本信息 |
参考实例
删除空目录:
aaa@qq.com:~$ rmdir dir
递归删除指定的目录树:
aaa@qq.com:~$ rmdir -p dir/dir_1/dir_2
显示指令详细执行过程:
aaa@qq.com:~$ rmdir -v dir
rmdir: 正在删除目录 'dir'
aaa@qq.com:~$ rmdir -p -v dir/dir_1/dir_2
rmdir: 正在删除目录 'dir/dir_1/dir_2
rmdir: 正在删除目录 'dir/dir_1'
rmdir: 正在删除目录 'dir_2'
显示命令的版本信息:
aaa@qq.com:/usr$ rmdir --version
rmdir (GNU coreutils) 8.28
Copyright (C) 2017 Free Software Foundation, Inc.
许可证:GPLv3+:GNU 通用公共许可证第3 版或更新版本<http://gnu.org/licenses/gpl.html>。
本软件是*软件:您可以*修改和重新发布它。
在法律范围内没有其他保证。
由David MacKenzie 编写。
3.6. tree命令 – 以树状图列出目录内容
tree命令的全称即是“tree”,该命令作用是用于以树状图形式列出目录的内容。 执行tree命令,它会以树状图的方式列出指定目录下的所有文件,包括目录里的文件,显示出指定目录的文件目录结构。
语法格式:tree [参数]
常用参数:
参数 | 解释 |
---|---|
-a | 显示所有文件和目录 |
-A | 使用ASNI绘图字符显示树状图而非以ASCII字符组合 |
-C | 在文件和目录清单加上色彩,便于区分这种类型 |
-d | 显示目录名称而非内容 |
-D | 列出文件或目录的更改时间 |
-f | 在每个文件或目录之前,显示完整的相对路径名称 |
-F | 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上“*”,“/”,“=”,“@”,“ |
-g | 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码 |
-i | 不以阶梯状列出文件或目录名称 |
-I<范本样式> | 不现实符合范本样式的文件或目录名称 |
-l | 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录 |
-n | 不在文件和目录清单上加上色彩 |
-N | 直接列出文件和目录名称,包括控制字符 |
-p | 列出权限标示 |
-P<范本样式> | 只显示符合范本像是的文件或目录名称 |
-q | 用“?”号取代控制字符,列出文件和目录名称 |
-s | 列出文件或目录大小 |
-t | 用文件和目录的更改时间排序 |
-u | 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码 |
-x | 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该子目录予以排除在寻找范围外 |
-L | 层级显示 |
参考实例
列出目录 /usr 第一级文件名
aaa@qq.com:/$ tree /usr -L 1
/usr
├── 777
├── bin
├── games
├── hirak0
├── include
├── lib
├── libexec
├── local
├── sbin
├── share
└── src
11 directories, 0 files
忽略文件夹
tree -I node_modules # 忽略当前目录文件夹 node_modules
tree -P node_modules # 列出当前目录文件夹 node_modules 的目录结构
tree -P node_modules -L 2 # 显示目录 node_modules 两层的目录树结构
tree -L 2 > /home/www/tree.txt # 当前目录结果存到 tree.txt 文件中
忽略多个文件夹
tree -I 'node_modules|icon|font' -L 2
只显示n层目录(n为数字):
aaa@qq.com:~$ tree -L 2
用文件和目录的更改时间排序:
aaa@qq.com:~$ tree -t
以相反次序排序:
aaa@qq.com:~$ tree -r
在每个文件或目录之前,显示完整的相对路径:
aaa@qq.com:~$ tree -f
只显示目录:
aaa@qq.com:~$ tree -d
显示所有文件和目录:
aaa@qq.com:~$ tree -a
3.7. touch命令 – 创建文件
touch命令有两个功能:一是创建新的空文件,二是改变已有文件的时间戳属性。
touch命令会根据当前的系统时间更新指定文件的访问时间和修改时间。如果文件不存在,将会创建新的空文件,除非指定了”-c”或”-h”选项。
注意:在修改文件的时间属性的时候,用户必须是文件的属主,或拥有写文件的访问权限。
语法格式:touch [参数] [文件]
常用参数:
参数 | 解释 |
---|---|
-a | 改变档案的读取时间记录 |
-m | 改变档案的修改时间记录 |
-r | 使用参考档的时间记录,与 --file 的效果一样 |
-c | 不创建新文件 |
-d | 设定时间与日期,可以使用各种不同的格式 |
-t | 设定档案的时间记录,格式与 date 命令相同 |
–no-create | 不创建新文件 |
–help | 显示帮助信息 |
–version | 列出版本讯息 |
参考实例
创建空文件:
aaa@qq.com:~$ touch file.txt
批量创建文件:
aaa@qq.com:~$ touch file{1..5}.txt
aaa@qq.com:~/test$ ls
file1.txt file2.txt file3.txt file4.txt file5.txt
修改文件的access(访问)时间:
aaa@qq.com:~/test$ stat file.txt
文件:file.txt
大小:0 块:0 IO 块:4096 普通空文件
设备:801h/2049d Inode:917658 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 1000/ hirak0) Gid:( 1000/ hirak0)
最近访问:2020-11-05 15:42:04.094598288 +0800
最近更改:2020-11-05 15:42:04.094598288 +0800
最近改动:2020-11-05 15:42:04.094598288 +0800
创建时间:-
aaa@qq.com:~$ touch -a file.txt
aaa@qq.com:~/test$ stat file.txt
文件:file.txt
大小:0 块:0 IO 块:4096 普通空文件
设备:801h/2049d Inode:917658 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 1000/ hirak0) Gid:( 1000/ hirak0)
最近访问:2020-11-05 15:43:05.155512764 +0800
最近更改:2020-11-05 15:42:04.094598288 +0800
最近改动:2020-11-05 15:43:05.155512764 +0800
创建时间:-
3.8. ln命令 – 为文件创建链接
ln命令是linux系统中一个非常重要命令,英文全称是“link”,即链接的意思,它的功能是为某一个文件在另外一个位置建立一个同步的链接。 一种是hard link,又称为硬链接;另一种是symbolic link,又称为符号链接。
通俗一点理解,可以把硬链接当成源文件的副本,他和源文件一样的大小,但是事实上却不占任何空间。符号链接可以理解为类似windows一样的快捷方式。
符号链接 :
- 符号链接以路径的形式存在,类似于Windows操作系统中的快捷方式。
- 符号链接可以跨文件系统 ,硬链接不可以。
- 符号链接可以对一个不存在的文件名进行链接,硬链接不可以。
- 符号链接可以对目录进行链接,硬链接不可以。
硬链接:
- 硬链接以文件副本的形式存在,但不占用实际空间。
- 硬链接不允许给目录创建硬链接。
- 硬链接只有在同一个文件系统中才能创建。
语法格式: ln [参数] [源文件或目录] [目标文件或目录]
常用参数:
参数 | 解释 |
---|---|
-b | 为每个已存在的目标文件创建备份文件 |
-d | 此选项允许“root”用户建立目录的硬链接 |
-f | 强制创建链接,即使目标文件已经存在 |
-n | 把指向目录的符号链接视为一个普通文件 |
-i | 交互模式,若目标文件已经存在,则提示用户确认进行覆盖 |
-s | 对源文件建立符号链接,而非硬链接 |
-v | 详细信息模式,输出指令的详细执行过程 |
参考实例
为源文件file.txt创建硬链接file_1:
aaa@qq.com:~$ ln /root/dir/file.txt ./file_1
使用ln命令的“-s”参数来创建目录的符号链接,并使用ls命令来查看链接文件的详细信息:
aaa@qq.com:~$ ln -s dir file
aaa@qq.com:~/test$ ls -l
总用量 4
-rw-r--r-- 2 hirak0 hirak0 0 11月 5 15:42 file_1
-rw-r--r-- 1 hirak0 hirak0 0 11月 5 15:42 file1.txt
-rw-r--r-- 1 hirak0 hirak0 0 11月 5 15:42 file2.txt
-rw-r--r-- 1 hirak0 hirak0 0 11月 5 15:42 file3.txt
-rw-r--r-- 1 hirak0 hirak0 0 11月 5 15:42 file4.txt
-rw-r--r-- 1 hirak0 hirak0 0 11月 5 15:42 file5.txt
-rw-r--r-- 2 hirak0 hirak0 0 11月 5 15:42 file.txt
drwxr-xr-x 3 hirak0 hirak0 4096 11月 5 15:25 test1
使用ln命令的“-v”参数来输出命令的详细执行过程:
aaa@qq.com:~$ ln -v /root/dir/file.txt ./file_1
'./file_1' => '/root/dir/file.txt'
使用ln命令的“-b”命令来创建目标文件的备份文件,并使用ls命令来查看:
aaa@qq.com:~$ ln -b /root/dir/file.txt ./file_1
aaa@qq.com:~$ ls
anaconda-ks.cfg file_1 file_1~ dir
3.9. rename命令 – 批量改变文件名
rename命令用字符串替换的方式批量改变文件名。
- 原字符串:将文件名需要替换的字符串;
- 目标字符串:将文件名中含有的原字符替换成目标字符串;
- 文件:指定要改变文件名的文件列表。
语法格式:rename [参数]
常用参数:
参数 | 解释 |
---|---|
? | 可替代单个字符 |
* | 可替代多个字符 |
参考实例
将main1.c重命名为main.c:
aaa@qq.com:~$ rename main1.c main.c main1.c
将所有以jpg结尾的文件重命名为以png结尾的文件:
aaa@qq.com:~$ rename .jpg .png *.jpg
文件夹中有这些文件:foo1, …, foo9, foo10, …, foo163,把foo1到foo9的文件重命名为foo01到foo09:
aaa@qq.com:~$ rename foo foo0 foo?
把foo01到foo99的所有文件重命名为foo001到foo099:
aaa@qq.com:~$ rename foo foo0 foo??
把foo001到foo163的所有文件重命名为foo0001到foo0163:
aaa@qq.com:~$ rename foo foo0 foo*
把foo0100到foo0163的所有文件重命名为foo100到foo163:
aaa@qq.com:~$ rename foo0 foo foo0[1]*
3.10. stat命令 – 显示文件状态信息
stat命令用来显示文件或文件系统的详细信息
语法格式:stat [参数]
常用参数:
参数 | 解释 |
---|---|
-L | 支持符号链接 |
-f | 显示文件系统的信息 |
-t | 以简洁的方式输出 |
–help | 显示命令帮助信息 |
–version | 显示命令版本信息 |
参考实例
查看文件 anaconda-ks.cfg 的三种时间状态:Access,Modify,Change:
aaa@qq.com:~$ stat anaconda-ks.cfg
查看文件系统信息:
aaa@qq.com:~$ stat -f anaconda-ks.cfg
以简洁的方式输出信息:
aaa@qq.com:~$ stat -t anaconda-ks.cfg
anaconda-ks.cfg 1229 8 8180 0 0 fd00 68898764 1 0 0 1540481629 1540510390 1540510390 0 4096 system_u:object_r:admin_home_t:s0
命令版本信息:
aaa@qq.com:~$ stat --version
stat (GNU coreutils) 8.28
Copyright (C) 2017 Free Software Foundation, Inc.
3.11. file命令 – 识别文件类型
file命令用来识别文件类型,也可用来辨别一些文件的编码格式。它是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的。
语法格式:file [参数] [文件]
常用参数:
参数 | 解释 |
---|---|
-b | 列出辨识结果时,不显示文件名称 (简要模式) |
-c | 详细显示指令执行过程,便于排错或分析程序执行的情形 常与 -m 一起使用,用来在安装幻数文件之前调试它 |
-f | 指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称 |
-L | 直接显示符号连接所指向的文件类别 |
-m | 指定魔法数字文件 |
-v | 显示版本信息 |
-z | 尝试去解读压缩文件的内容 |
-i | 显示MIME类别 |
参考实例:
显示文件类型:
aaa@qq.com:~$ file install.log
install.log: UTF-8 Unicode text
显示文件类型,不显示文件名称:
aaa@qq.com:~$ file -b install.log
UTF-8 Unicode text
显示文件类型, 显示MIME类别,不显示文件名称:
aaa@qq.com:~$ file -b -i install.log
text/plain; charset=utf-8
显示符号链接的文件类型:
aaa@qq.com:~$ ls -l /var/mail
lrwxrwxrwx 1 root root 10 08-13 00:11 /var/mail -> spool/mail
aaa@qq.com:~$ file /var/mail
/var/mail: symbolic link to `spool/mail'
显示符号连接所指向的文件类别:
aaa@qq.com:~$ file -L /var/mail
/var/mail: directory
3.12. chmod命令 – 改变文件或目录权限
chmod命令的英文原意是“change the permissions mode of a file”,我们简称为“change mode”,意为用来改变文件或目录权限的命令,但是只有文件的属主和超级用户root才能执行这个命令。有两种模式,一种是采用权限字母和操作符表达式;另一种是采用数字。
语法格式: chmod [参数] [文件]
常用参数:
参数 | 解释 |
---|---|
-c | 若该文件权限确实已经更改,才显示其更改动作 |
-f | 若该文件权限无法被更改也不显示错误讯息 |
-v | 显示权限变更的详细资料 |
-R | 对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更) |
参考实例
将档案 file1.txt 设为所有人皆可读取:
aaa@qq.com:~$ chmod a+r file.txt
将目前目录下的所有文件与子目录皆设为任何人可读取 :
aaa@qq.com:~$ chmod -R a+r *
将 file.txt 设定为只有该文件拥有者可以执行:
aaa@qq.com:~$ chmod u+x file.txt
知识扩展:
Linux 用 户分为:拥有者、组群(Group)、其他(other),Linux 系统中,预设的情況下,系统中所有的帐号与一般身份使用者,以及 root 的相关信 息, 都是记录在/etc/passwd文件中。每个人的密码则是记录在/etc/shadow文件下。 此外,所有的组群名称记录在/etc/group內!
linux 文件的用户权限的分析图
-rw-r--r-- 1 user staff 651 Oct 12 12:53 .gitmodules
# ↑╰┬╯╰┬╯╰┬╯
# ┆ ┆ ┆ ╰┈ 0 其他人
# ┆ ┆ ╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ g 属组
# ┆ ╰┈┈┈┈ u 属组
# ╰┈┈ 第一个字母 `d` 代表目录,`-` 代表普通文件
例:rwx rw- r--
r=读取属性 //值= 4
w=写入属性 //值= 2
x=执行属性 //值= 1
示例:
chmod u+x,g+w f01 # 为文件f01设置自己可以执行,组员可以写入的权限
chmod u=rwx,g=rw,o=r f01
chmod 764 f01
chmod a+x f01 # 对文件f01的u,g,o都设置可执行属性
# 将/home/wwwroot/里的所有文件和文件夹设置为755权限
chmod -R 755 /home/wwwroot/*
3.13. chown命令 – 改变文件或目录用户和用户组
Linux/Unix 属于多用户多任务操作系统,所有的文件皆有拥有者。利用 chown 命令可以将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID,组可以是组名或者组ID,文件是以空格分开的要改变权限的文件列表,支持通配符。 一般来说,这个指令仅限系统管理者(root)所使用,普通用户没有权限改变文件所属者及所属组。
语法格式:chown [参数]
常用参数:
参数 | 解释 |
---|---|
-R | 对目前目录下的所有文件与子目录进行相同的拥有者变更 |
-c | 若该文件拥有者确实已经更改,才显示其更改动作 |
-f | 若该文件拥有者无法被更改也不要显示错误讯息 |
-h | 只对于连结(link)进行变更,而非该 link 真正指向的文件 |
-v | 显示拥有者变更的详细资料 |
–help | 显示辅助说明 |
–version | 显示版本 |
参考实例
将test.txt文件用户组与用户都改为bin:
aaa@qq.com:~/test$ ll file.txt
-rw-r--r-- 2 hirak0 hirak0 0 11月 5 15:42 file.txt
aaa@qq.com:~/test$ sudo chown bin:bin file.txt
aaa@qq.com:~/test$ ll file.txt
-rw-r--r-- 2 bin bin 0 11月 5 15:42 file.txt
显示改动动作:
aaa@qq.com:~/test$ ll file1.txt
-rw-r--r-- 1 hirak0 hirak0 0 11月 5 15:42 file1.txt
aaa@qq.com:~/test$ sudo chown -c bin:bin file1.txt
changed ownership of 'file1.txt' from hirak0:hirak0 to bin:bin
将当前目录下所有文件的拥有者都改为 hirak0,用户组改为 test:
aaa@qq.com:~/test$ sudo chown -R hirak0:test *
aaa@qq.com:~/test$ ll
总用量 12
drwxr-xr-x 3 hirak0 hirak0 4096 11月 5 15:44 ./
drwxr-xr-x 19 hirak0 hirak0 4096 11月 5 15:23 ../
-rw-r--r-- 2 hirak0 test 0 11月 5 15:42 file_1
-rw-r--r-- 1 hirak0 test 0 11月 5 15:42 file1.txt
-rw-r--r-- 1 hirak0 test 0 11月 5 15:42 file2.txt
-rw-r--r-- 1 hirak0 test 0 11月 5 15:42 file3.txt
-rw-r--r-- 1 hirak0 test 0 11月 5 15:42 file4.txt
-rw-r--r-- 1 hirak0 test 0 11月 5 15:42 file5.txt
-rw-r--r-- 2 hirak0 test 0 11月 5 15:42 file.txt
drwxr-xr-x 3 hirak0 test 4096 11月 5 15:25 test1/
3.14. locate命令 – 快速查找文件或目录
locate命令其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb,值得注意的是:版本不同,会有所不同。有的版本位置是 /var/lib/mlocate/mlocatedb ,还有的是/var/lib/slocate/slocate.db ,这个数据库中含有本地所有文件信息。
Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
语法格式:locate [参数] [文件]
常用参数:
参数 | 解释 |
---|---|
-d<目录>或–database=<目录> | 指定数据库所在的目录 |
–help | 显示帮助 |
–version | 显示版本信息 |
参考实例
搜索/etc目录下所有以sh开头的文件:
aaa@qq.com:~$ locate /etc/sh
/etc/shadow
/etc/shadow-
/etc/shells
/snap/core18/1885/etc/shadow
/snap/core18/1885/etc/shells
搜索/etc目录下以k开头的文件:
aaa@qq.com:~$ locate /etc/k
/etc/kernel
/etc/kernel-img.conf
/etc/kerneloops.conf
/etc/kernel/install.d
/etc/kernel/postinst.d
/etc/kernel/postrm.d
/etc/kernel/preinst.d
/etc/kernel/postinst.d/apt-auto-removal
/etc/kernel/postinst.d/initramfs-tools
/etc/kernel/postinst.d/unattended-upgrades
/etc/kernel/postinst.d/update-notifier
/etc/kernel/postinst.d/zz-update-grub
/etc/kernel/postrm.d/initramfs-tools
/etc/kernel/postrm.d/zz-update-grub
/etc/kernel/preinst.d/intel-microcode
查找和pwd相关的所有文件:
aaa@qq.com:~$ locate pwd
/bin/pwd
/etc/.pwd.lock
/lib/modules/5.4.0-51-generic/kernel/drivers/watchdog/hpwdt.ko
/lib/modules/5.4.0-52-generic/kernel/drivers/watchdog/hpwdt.ko
/sbin/pam_extrausers_chkpwd
/sbin/unix_chkpwd
/snap/core18/1885/bin/pwd
/snap/core18/1885/etc/.pwd.lock
/snap/core18/1885/sbin/pam_extrausers_chkpwd
/snap/core18/1885/sbin/unix_chkpwd
/snap/core18/1885/usr/bin/pwdx
/snap/core18/1885/usr/share/bash-completion/completions/pwd
/snap/core18/1885/usr/share/bash-completion/completions/pwdx
/snap/gnome-3-34-1804/36/usr/include/pwd.h
/usr/bin/pwdx
/usr/include/pwd.h
/usr/lib/syslinux/modules/bios/pwd.c32
/usr/lib/syslinux/modules/efi32/pwd.c32
/usr/lib/syslinux/modules/efi64/pwd.c32
/usr/share/bash-completion/completions/pwd
/usr/share/bash-completion/completions/pwdx
/usr/share/go-1.10/src/syscall/pwd_plan9.go
/usr/share/help-langpack/en_GB/empathy/irc-join-pwd.page
/usr/share/help-langpack/zh_CN/empathy/irc-join-pwd.page
/usr/share/man/man1/pwd.1.gz
/usr/share/man/man1/pwdx.1.gz
/usr/share/man/man3/lckpwdf.3.gz
/usr/share/man/man3/ulckpwdf.3.gz
/usr/share/man/man8/unix_chkpwd.8.gz
/usr/src/linux-headers-5.4.0-51-generic/include/config/hpwdt
/usr/src/linux-headers-5.4.0-51-generic/include/config/hpwdt/nmi
/usr/src/linux-headers-5.4.0-51-generic/include/config/hpwdt/nmi/decoding.h
/usr/src/linux-headers-5.4.0-52-generic/include/config/hpwdt
/usr/src/linux-headers-5.4.0-52-generic/include/config/hpwdt/nmi
/usr/src/linux-headers-5.4.0-52-generic/include/config/hpwdt/nmi/decoding.h
/var/cache/cracklib/cracklib_dict.pwd
3.15. find命令 – 查找和搜索文件
find命令可以根据给定的路径和表达式查找的文件或目录。find参数选项很多,并且支持正则,功能强大。和管道结合使用可以实现复杂的功能,是系统管理者和普通用户必须掌握的命令。
find如不加任何参数,表示查找当前路径下的所有文件和目录,如果服务器负载比较高尽量不要在高峰期使用find命令,find命令模糊搜索还是比较消耗系统资源的。
语法格式:find [参数] [路径] [查找和搜索范围]
常用参数:
参数 | 解释 |
---|---|
-name | 按名称查找 |
-size | 按大小查找 |
-user | 按属性查找 |
-type | 按类型查找 |
-iname | 忽略大小写 |
参考实例
使用-name参数查看/etc目录下面所有的.conf结尾的配置文件:
aaa@qq.com:~$ find /etc -name "*.conf
使用-size参数查看/etc目录下面大于1M的文件:
aaa@qq.com:~$ find /etc -size +1M
查找当前用户主目录下的所有文件:
aaa@qq.com:~$ find $HOME -print
列出当前目录及子目录下所有文件和文件夹:
aaa@qq.com:~$ find .
在/home目录下查找以.txt结尾的文件名:
aaa@qq.com:~$ find /home -name "*.txt"
在/var/log目录下忽略大小写查找以.log结尾的文件名:
aaa@qq.com:~$ find /var/log -iname "*.log"
搜索超过七天内被访问过的所有文件:
aaa@qq.com:~$ find . -type f -atime +7
搜索访问时间超过10分钟的所有文件:
aaa@qq.com:~$ find . -type f -amin +10
找出/home下不是以.txt结尾的文件:
aaa@qq.com:~$ find /home ! -name "*.txt"
3.16. cp命令 – 复制文件或目录
cp命令可以理解为英文单词copy的缩写,其功能为复制文件或目录。
cp命令可以将多个文件复制到一个具体的文件名或一个已经存在的目录下,也可以同时复制多个文件到一个指定的目录中。
语法格式:cp [参数] [文件]
参数
- 源文件:制定源文件列表。默认情况下,cp 命令不能复制目录,如果要复制目录,则必须使用-R选项;
- 目标文件:指定目标文件。当“源文件”为多个文件时,要求“目标文件”为指定的目录。
常用参数:
参数 | 解释 |
---|---|
-f | 若目标文件已存在,则会直接覆盖原文件 |
-i | 若目标文件已存在,则会询问是否覆盖 |
-p | 保留源文件或目录的所有属性 |
-r | 递归复制文件和目录 |
-d | 当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录 |
-l | 对源文件建立硬连接,而非复制文件 |
-s | 对源文件建立符号连接,而非复制文件 |
-b | 覆盖已存在的文件目标前将目标文件备份 |
-v | 详细显示cp命令执行的操作过程 |
-a | 等价于“dpr”选项 |
参考实例
复制目录:
aaa@qq.com:~$ cp -R dir1 dir2/
将文件test1改名为test2:
aaa@qq.com:~$ cp -f test1 test2
复制多个文件:
aaa@qq.com:~$ cp -r file1 file2 file3 dir
交互式地将目录 /usr/linuxcool 中的所有.c文件复制到目录 dir 中:
aaa@qq.com:~$ cp -r /usr/hirak0/*.c dir
3.17. scp命令 – 远程拷贝文件
scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。linux的scp命令可以在linux服务器之间复制文件和目录。 scp命令用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。
当你服务器硬盘变为只读read only system时,用scp可以帮你把文件移出来。另外,scp还非常不占资源,不会提高多少系统负荷,在这一点上,rsync就远远不及它了。虽然 rsync比scp会快一点,但当小文件众多的情况下,rsync会导致硬盘I/O非常高,而scp基本不影响系统正常使用。
语法格式:scp [参数] [文件]
常用参数:
参数 | 解释 |
---|---|
-1 | 使用ssh协议版本1-2 |
-2 | 使用ssh协议版本2 |
-4 | 使用ipv4 |
-6 | 使用ipv6 |
-B | 以批处理模式运行 |
-C | 使用压缩 |
-F | 指定ssh配置文件 |
-l | 指定宽带限制 |
-o | 指定使用的ssh选项 |
-P | 指定远程主机的端口号 |
-p | 保留文件的最后修改时间,最后访问时间和权限模式 |
-q | 不显示复制进度 |
-r | 以递归方式复制 |
参考实例
从远程复制文件到本地目录:
aaa@qq.com:~$ scp aaa@qq.com:/opt/soft/rhel-server-7.3-x86_64.tar.gz /opt/soft/
从远程复制目录到本地:
aaa@qq.com:~$ scp -r aaa@qq.com:/opt/soft/mysql /opt/soft/
上传本地文件到远程机器指定目录:
aaa@qq.com:~$ scp /opt/soft/rhel-server-7.3-x86_64.tar.gz aaa@qq.com:/opt/soft/scptest
上传本地目录到远程机器指定目录:
aaa@qq.com:~$ scp -r /opt/soft/mysql aaa@qq.com:/opt/soft/scptest
保留文件的最后修改时间,最后访问时间和权限模式:
aaa@qq.com:~$ scp -p /root/install.log aaa@qq.com:/tmp
3.18. mv命令 – 移动或改名文件
mv命令是“move”单词的缩写,其功能大致和英文含义一样,可以移动文件或对其改名。
这是一个使用频率超高的文件管理命令,我们需要特别留意它与复制的区别:mv与cp的结果不同。mv命令好像文件“搬家”,文件名称发生改变,但个数并未增加。而cp命令是对文件进行复制操作,文件个数是有增加的。
语法格式:mv [参数]
常用参数:
参数 | 解释 |
---|---|
-i | 若存在同名文件,则向用户询问是否覆盖 |
-f | 覆盖已有文件时,不进行任何提示 |
-b | 当文件存在时,覆盖前为其创建一个备份 |
-u | 当源文件比目标文件新,或者目标文件不存在时,才执行移动此操作 |
参考实例
将文件file_1重命名为file_2:
aaa@qq.com:~$ mv file_1 file_2
将文件file移动到目录dir中 :
aaa@qq.com:~$ mv file /dir
将目录dir1移动目录dir2中(前提是目录dir2已存在,若不存在则改名):
aaa@qq.com:~$ mv /dir1 /dir2
将目录dir1下的文件移动到当前目录下:
aaa@qq.com:~$ mv /dir1/* .
mv file1.txt /home/office/ # 移动单个文件
mv file2.txt file3.txt file4.txt /home/office/ # 移动多个文件
mv *.txt /home/office/ # 移动所有 txt 文件
mv dir1/ /home/office/ # 移动目录
mv /usr/men/* . # 将指定目录中的所有文件移到当前目录中
mv file1.txt file2.txt # 重命名文件
mv dir1/ dir2/ # 重命名目录
mv -v *.txt /home/office # 打印移动信息
mv -i file1.txt /home/office # 提示是否覆盖文件
mv -uv *.txt /home/office # 源文件比目标文件新时才执行更新
mv -vn *.txt /home/office # 不要覆盖任何已存在的文件
mv -f *.txt /home/office # 无条件覆盖已经存在的文件
mv -bv *.txt /home/office # 复制时创建备份
3.19. rm命令 – 移除文件或目录
rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件,只是删除了链接,原有文件均保持不变。 rm也是一个危险的命令,使用的时候要特别当心,尤其对于新手,否则整个系统就会毁在这个命令(比如在/(根目录)下执行rm * -rf)。所以,我们在执行rm之前最好先确认一下在哪个目录,到底要删除什么东西,操作时保持高度清醒的头脑。
语法格式:rm [参数] [文件]
常用参数:
参数 | 解释 |
---|---|
-f | 忽略不存在的文件,不会出现警告信息 |
-i | 删除前会询问用户是否操作 |
-r/R | 递归删除 |
-v | 显示指令的详细执行过程 |
参考实例
删除前逐一询问确认:
aaa@qq.com:~$ rm -i test.txt.bz2
rm: remove regular file `test.txt.bz2'?
直接删除,不会有任何提示:
aaa@qq.com:~$ rm -f test.txt.bz2
递归删除目录及目录下所有文件:
aaa@qq.com:~$ mkdir /data/log
aaa@qq.com:~$ rm -rf /data/log
删除当前目录下所有文件:
aaa@qq.com:~$ rm -rf *
清空系统中所有的文件(谨慎):
aaa@qq.com:~$ rm -rf /*
上一篇: Linux命令-系统管理