Linux 之旅 4:文件与目录管理
目录与路径
相对路径与绝对路径
这个相当基础,所以这里不过多阐述,不了解的可以搜索其他资料学习。
目录的相关操作
在Linux中有这么几个目录相关的特殊符号需要留意:
.
表示当前目录..
表示上层目录-
表示之前所在的目录~
表示当前用户的家目录~account
表示用户account
的家目录
和目录相关的命令主要有:
cd
:将当前的工作目录切换到指定目录pwd
:打印当前工作目录的完整路径mkdir
:新建目录rmdir
:删除目录
cd
我们看cd
命令(change directory)的实际使用示例:
[icexmoon@xyz ~]$ su -
密码:
上一次登录:一 8月 9 16:16:12 CST 2021pts/0 上
ABRT has detected 1 problem(s). For more info run: abrt-cli list --since 1628496972
[root@xyz ~]# pwd
/root
[root@xyz ~]# cd ~icexmoon
[root@xyz icexmoon]# pwd
/home/icexmoon
[root@xyz icexmoon]# cd -
/root
[root@xyz ~]# pwd
/root
[root@xyz ~]# cd /
[root@xyz /]# exit
登出
pwd
pwd
对应的英文是print working directory,即打印工作目录,我们看实例:
[icexmoon@xyz ~]$ cd /var/mail
[icexmoon@xyz mail]$ pwd
/var/mail
[icexmoon@xyz mail]$ pwd -P
/var/spool/mail
[icexmoon@xyz mail]$ ls -ald /var/mail
lrwxrwxrwx. 1 root root 10 7月 24 14:33 /var/mail -> spool/mail
需要注意的是,如果使用-P
参数,如果当前工作目录是一个符号链接,则会显示其指向的真实路径,这点我们通过ls
命令可以证实。
mkdir
mkdir
(make directory)的用途是创建一个新目录:
[icexmoon@xyz mail]$ mkdir /tmp/test2
[icexmoon@xyz mail]$ ls -ald /tmp/test2
drwxrwxr-x. 2 icexmoon icexmoon 6 8月 9 19:40 /tmp/test2
[icexmoon@xyz mail]$ mkdir /tmp/test2/test3/test4/test5
mkdir: 无法创建目录"/tmp/test2/test3/test4/test5": 没有那个文件或目录
[icexmoon@xyz mail]$ mkdir -p /tmp/test2/test3/test4/test5
[icexmoon@xyz mail]$ ls -ald /tmp/test2/test3/test4/test5
drwxrwxr-x. 2 icexmoon icexmoon 6 8月 9 19:41 /tmp/test2/test3/test4/test5
命令本身没有什么值得说的,只要权限正确,就可以创建相应的目录。
需要注意的是默认状态是无法创建多个“级联”目录的,即你只能在一个已经存在的目录下创建一个新目录,如果你想一次性创建多层本来不存在的目录,可以使用-p
参数。
rmdir
rmdir
(remove directory)的用途是删除一个空目录,需要注意的是必须是空目录才能用这个命令删除。
[icexmoon@xyz mail]$ rmdir /tmp/test2/test3/test4/test5
[icexmoon@xyz mail]$ ls -al /tmp/test2/test3/test4/
总用量 0
drwxrwxr-x. 2 icexmoon icexmoon 6 8月 9 19:45 .
drwxrwxr-x. 3 icexmoon icexmoon 19 8月 9 19:41 ..
[icexmoon@xyz mail]$ sudo rmdir -p /tmp/test2/test3/test4
rmdir: 删除目录 "/tmp" 失败: 设备或资源忙
[icexmoon@xyz mail]$ ls -al /tmp/test*
总用量 4
drwxrwxr-x. 2 icexmoon icexmoon 6 8月 8 17:28 .
drwxrwxrwt. 22 root root 4096 8月 9 19:47 ..
[icexmoon@xyz mail]$
默认情况下这个命令仅会删除目标目录,如果你想将目标目录层级中的所有空目录一起删除的话,可以使用-p
参数,虽然在实例中执行rmdir -p
显示删除/tmp
失败,但实际上/tmp/test2
、/tmp/test2/test3
等中间层级的空目录都被删除了,而/tmp
不是空目录,所以没有删除,这显然是复合我们期望的。
实际上这个命令使用频率并不高,因为大多数情况下我们需要删除的目录都不是空目录,此时我们需要执行的命令是rm -r 目录
,当然执行这个命令要慎重,删除了关键文件会导致系统无法开机,这也是为什么不推荐使用root
用户进行日常工作。
关于可执行文件夹路径的变量:$PATH
和Windows一样,Linux同样是借助环境变量来实现对可执行命令的检索,甚至变量名也同样是PATH
,我们可以通过echo
命令来进行查看当前用户的该变量:
[icexmoon@xyz mail]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/icexmoon/.local/bin:/home/icexmoon/bin
不同的路径使用:
进行分割。
可以看到,就像之前说的,FHS规定常用的应用会放在/usr/bin
以及/usr/sbin
,而这两个目录都在环境变量PATH中,所以我们是可以在命令行下直接执行的,此外可以看到用户的家目录下的.local/bin
和bin
也已经被写入PATH,所以用户自己安装的应用可以放在这两个地方,就可以直接执行。
此外,如果我们需要把某个目录加入PATH变量,可以这样:
[icexmoon@xyz mail]$ PATH="${
PATH}:/root"
[icexmoon@xyz mail]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/icexmoon/.local/bin:/home/icexmoon/bin:/root
文件与目录管理
ls
ls
命令用于查看目录和文件的信息:
[icexmoon@xyz mail]$ ls -al ~
总用量 48
drwx------. 15 icexmoon icexmoon 4096 8月 9 14:58 .
drwxr-xr-x. 3 root root 22 7月 24 14:45 ..
-rw-------. 1 icexmoon icexmoon 5373 8月 9 16:43 .bash_history
-rw-r--r--. 1 icexmoon icexmoon 18 4月 1 2020 .bash_logout
-rw-r--r--. 1 icexmoon icexmoon 193 4月 1 2020 .bash_profile
-rw-r--r--. 1 icexmoon icexmoon 231 4月 1 2020 .bashrc
drwx------. 19 icexmoon icexmoon 4096 8月 9 15:01 .cache
drwxr-xr-x. 16 icexmoon icexmoon 4096 7月 29 16:16 .config
drwx------. 3 icexmoon icexmoon 25 7月 24 14:49 .dbus
这是最常用的方式,可以查看所有文件(包括.
开头的隐藏文件)的信息。
[icexmoon@xyz mail]$ ls -alF --color=never ~
总用量 48
drwx------. 15 icexmoon icexmoon 4096 8月 9 14:58 ./
drwxr-xr-x. 3 root root 22 7月 24 14:45 ../
-rw-------. 1 icexmoon icexmoon 5373 8月 9 16:43 .bash_history
-rw-r--r--. 1 icexmoon icexmoon 18 4月 1 2020 .bash_logout
-rw-r--r--. 1 icexmoon icexmoon 193 4月 1 2020 .bash_profile
-rw-r--r--. 1 icexmoon icexmoon 231 4月 1 2020 .bashrc
drwx------. 19 icexmoon icexmoon 4096 8月 9 15:01 .cache/
drwxr-xr-x. 16 icexmoon icexmoon 4096 7月 29 16:16 .config/
drwx------. 3 icexmoon icexmoon 25 7月 24 14:49 .dbus/
-rw-------. 1 icexmoon icexmoon 16 7月 24 14:49 .esd_auth
-rw-------. 1 icexmoon icexmoon 3414 8月 9 14:58 .ICEauthority
-rw-------. 1 icexmoon icexmoon 35 7月 29 17:48 .lesshst
drwx------. 3 icexmoon icexmoon 19 7月 24 14:49 .local/
通常bash终端都可以用颜色区分ls
输出的文件和目录,使用--color=never
可以屏蔽颜色,使用-F
可以让输出的目录结尾加上/
以和文件区分。
[icexmoon@xyz mail]$ ls -al --full-time ~
总用量 48
drwx------. 15 icexmoon icexmoon 4096 2021-08-09 14:58:40.156100279 +0800 .
drwxr-xr-x. 3 root root 22 2021-07-24 14:45:46.681888462 +0800 ..
-rw-------. 1 icexmoon icexmoon 5373 2021-08-09 16:43:06.356025666 +0800 .bash_history
-rw-r--r--. 1 icexmoon icexmoon 18 2020-04-01 10:17:30.000000000 +0800 .bash_logout
-rw-r--r--. 1 icexmoon icexmoon 193 2020-04-01 10:17:30.000000000 +0800 .bash_profile
-rw-r--r--. 1 icexmoon icexmoon 231 2020-04-01 10:17:30.000000000 +0800 .bashrc
drwx------. 19 icexmoon icexmoon 4096 2021-08-09 15:01:45.238097720 +0800 .cache
drwxr-xr-x. 16 icexmoon icexmoon 4096 2021-07-29 16:16:38.468976492 +0800 .config
drwx------. 3 icexmoon icexmoon 25 2021-07-24 14:49:22.547003130 +0800 .dbus
加上--full-time
参数可以输出完整时间。
此外很多Linux发行版为了方便设定了alias命令ll
,其实就是ls -al
。
cp
cp
(copy)命令的用途是复制目录或文件,需要注意的是Linux下的目录和文件不仅内容重要,其属性也很重要,所以执行cp
命令的用户不同,效果也可能不同。
[root@xyz tmp]# cp /var/log/wtmp .
[root@xyz tmp]# ls -ald /var/log/wtmp wtmp
-rw-rw-r--. 1 root utmp 33408 8月 9 19:30 /var/log/wtmp
-rw-r--r--. 1 root root 33408 8月 9 20:19 wtmp
可以看到复制后的目录的权限是与源目录不同的。
[root@xyz tmp]# cp -a /var/log/wtmp wtmp2
[root@xyz tmp]# ls -ald /var/log/wtmp wtmp2
-rw-rw-r--. 1 root utmp 33408 8月 9 19:30 /var/log/wtmp
-rw-rw-r--. 1 root utmp 33408 8月 9 19:30 wtmp2
要和原文件完全一样的话可以使用-a
参数。
此外还有一个细节,如果复制的是目录,目标目录如果已经存在,被复制的目录会被添加到目标目录下边,成为子目录,如果目标目录不存在,则会直接复制过去,并命名为该目录名。
如果要将一个目标目录下的文件拷贝到一个已有目录下,就要这样:
[root@xyz tmp]# cp -ar /etc/* /tmp/etc2
[root@xyz tmp