Linux文件、目录管理(上)
一、系统目录结构
1 简述
对于目录,我们大致能够理解,像书本学的章节,每个章下又都有很多小节一样;而Linux目录和Windows目录有着很大的不同,Linux目录类似一个树,最顶层是其根目录,如下图:
用ls查看“/ ” “ls /” 查看根目录下的文件和目录;(不包含隐藏文件) “ls -a/” 会列出当前目录下所有文件和目录,含有隐藏文件
2 用tree命令显示目录和文件
利用**“tree”命令查看,这样看起来不是很直观;初次使用“tree”命令,系统里没有;要先用“yum”**命令安装它;
用**“man tree”** 查看**“tree”**命令的介绍和用法;
“tree -L 1 / ” = 查看根目录下一层的目录和文件(L 1为1层目录);此时看起来就比较直观;
3 常用目录说明:
目录名称 | 说明 |
---|---|
/bin | 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里。 |
/boot | 存放用于系统引导时使用的各种文件 |
/dev | 用于存放设备文件。 |
/etc | 存放系统管理和配置文件 |
/home | 存放所有用户文件的根目录,是用户主目录的基点,比如用户ying的主目录就是/home/ying |
/lib | 存放跟文件系统中的程序运行所需要的共享库及内核模块。共享库又叫动态链接共享库,作用类似windows里的.dll文件,存放了根文件系统程序运行所需的共享文件。 |
/lib64 | 与/lib一样,只是它64位系统 |
/media | 系统会自动识别一些设备(如U盘、光驱等),当识别后,Linux会把识别的设备挂载到该目录下。 |
/mnt | 系统提供该目录是为了让用户临时挂载别的文件系统。我们可以将光驱挂载到/mnt/上,然后进入该目录查看光驱里的内容。 |
/opt | 给主机额外安装软件所设置的目录,该目录默认为空。如你要安装一个ORACLE数据库,可以放到该目录下。 |
/proc | 虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息。 |
/root | 超级用户(系统管理员)的主目录 |
/run | 这个目录其实和/var/run是同一个目录,这里面存放的是一些服务的pid,一个服务启动完后,是有一个pid文件的。/run/进程产生的临时文件,一旦关机重启就消失了 |
/stv | 该目录存放的是一些服务启动之后需要提取的数据 |
/sys | 该目录存放的是与硬件驱动程序相关的信息。 |
/tmp | 该目录是用来存放一些临时文件的,权限很大,任何用户都可以再里面填写和删除 |
/usr | 用于存放系统应用程序,比较重要的目录/usr/local本地系统管理员软件安装目录(安装系统级的应用)。这是最庞大的目录,要用到的应用程序和文件几乎都在这个目录。 |
/var | 用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等。)等 |
二、ls命令
到目前为止,用"ls"这个命令比较频繁;它用来列取文件或者目录(全名:list)。
ls命令选项 | 说明 |
---|---|
ls | 列出当前目录下的文件和目录;(不包含隐藏文件) |
ls -a | 列出当前目录下所有的文件和目录,含有隐藏文件的 |
ls -l | 列出当前目录下所有除隐藏文件之外的所有文件的详细信息,包含权限,所属主,所属组以及文件创建日期和时间。 |
ls -lh | 在ls -l 的基础上,列出文件的大小 |
ls -lta | 以时间的顺序排序,从现在到之前顺序 |
ls -d | 列出目录本身 |
ls -ld | 列出显示目录的详细信息 |
ls -i | 显示文件索引节点号(inode)。一个索引节点代表一个文件 |
以下演示,常用的几种“ls”用法:
如果想了解更多的"ls"命令选项用法,可以"main ls"
三、文件类型
我们用ls-l 查看当前目录详细信息
[root@ying01 ~]# ls -l总用量 4-rw-------. 1 root root 1418 5月 . 9 02:25 anaconda-ks.cfg
第一列类型 | 说明 |
---|---|
d | 目录 |
- | 普通的文件 |
b | 光盘、光驱、磁盘 |
s | SQL文件 |
l | 软连接 |
c | 字符串设备 |
四、alias命令:
- “alias”=故名思议是取别名的意思,将一个常用的比较长的命令用一个别名替代。
- “which”=查询该命令所在目录;
用“which”查看“ls”,我们常用的“ls”其实是”ls --color=auto”的别名;
现实试验用“ls” 和”ls --color=auto”分别运行,可以看出执行结果是一模一样的;
系统默认下的别名;直接“alias”可以查看;
我们也可以自己设置一些名令的别名; alias 别名='命令'(注意命令要用'')
消除别名,unalias 别名
PATH命令,表示的一系列的路径,which在查看时用的就是PATH里的路径;在Linux安装一些软件通常要添加路径环境变量PATH.PATH环境变量通俗的讲就是把程序的路径"备案"到系统中,这样执行这些程序时就不需要输入完整路径,直接在bash输入程序名就可以执行.比如常用的"ls"命令就是添加好了环境变量才可以直接执行ls;
查看当前环境变量:echo $PATH
五、相对和绝对路径
-
绝对路径:就是从根开始的;绝对路径就是从/开始的路径;如/123属于绝对路径;~/123 用户家目录,属于绝对路径;
-
相对路径:不是以根开头的,相对当前目录来讲的路径;./123 属于相对路径;
[nba@damozhiying root]$ ls /home/nba user10 user12 user14 user17 user3 user7 ying111user1 user11 user13 user15 user18 user4 user8[nba@damozhiying root]$ ls /home/nba/ [nba@damozhiying root]$ touch /home/nba/1.txt //在nba新建文件[nba@damozhiying root]$ ls /home/nba/ //打开nba目录1.txt[nba@damozhiying root]$ ls ~ //此时可以看出ls ~可以打开/home/nba 用户家目录是绝对路径1.txt
pwd 查看当前在哪个目录
六、CD命令
cd 全称:"change directory",进入到哪个目录,如 :cd /root/.ssh/
命令 | 释义 |
---|---|
cd - | 将返回你上一的路径: |
cd 和 cd ~ | 切换到当前用户的家目录下 |
cd .. | 回到上一层目录 |
七、创建和删除目录mkdir rmdir
7.1 mkdir
mkdir: make directory;就是创建目录;用法:mkdir 目录(绝对路径)
mkdir -p:建立多级目录;
mkdir -pv :可视化创建进程
7.2 rmdir
rmdir:删除命令; 注意,它只能删除空目录;
那么touch 文件能否删除,结果一样,还是无法删除非空目录;那说明rmdir只能删除空目录;
八、rm命令
刚才测试rmdir只能删除非空目录(只是目录),而rm这个命令可以删除文件,也可以删除非空的目录。比较强大;
这里删除文件,都有提示,是否删除;“rm -f” :不会提示,直接删除;
history: 查看所有的输入指令记录,!tree,将运行history中最近一次的tree命令
rm -r,-rf 删除目录及相关联的
rm -rfv:可视化删除,新建两个txt文本;
因此rm -f 这个命令慎用;(不会提示,直接删除,效率之大,危险系数也大;)
九、环境变量PATH
PATH命令,表示的一系列的路径,which在查看时用的就是PATH里的路径;在Linux安装一些软件通常要添加路径环境变量PATH.PATH环境变量通俗的讲就是把程序的路径"备案"到系统中,这样执行这些程序时就不需要输入完整路径,直接在bash输入程序名就可以执行.比如常用的"ls"命令就是添加好了环境变量才可以直接执行ls;
那我们现在何自定义环境变量
第一步:先查看ls在哪个路径下,在这里我们可以看见他在/usr/bin下;
[root@ying01 ~]# which ls //查看which在哪个目录//alias ls='ls --color=auto' /usr/bin/ls
第二步:查看一下PATH(环境变量)下都有哪些目录
[root@ying01 ~]# echo $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
第三步:把 ls 的绝对路径CP一份到/tmp下
[root@ying01 ~]# cp /usr/bin/ls /tmp/ls2 //把ls命令复制到ls2,相当于复制ls//[root@ying01 ~]# ls /tmp/ks-script-jtXaOgls2
第四步:使用PATH(环境变量)赋值,在基础上再添加一个目录;
[root@ying01 ~]# PATH=$PATH:/tmp/[root@ying01 ~]# !echoecho $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/tmp/ //新增tmp目录//
第五步:which ls2 查看是否生效;我们看到ls2和ls 一样的功能;
[root@ying01 ~]# which ls2/tmp/ls2[root@ying01 ~]# ls23.txt anaconda-ks.cfg
但是这个环境变量只是在当前终端存在,不能永久存在;现在需要配置一个文件profile;
vi /etc/profile 进入按大“G"进入到最后一行,再按"A"让光标到最后一个字符末尾,回车;
上面略....unset iunset -f pathmungePATH=$PATH:/tmp/ //增加的语句
如何赋值PATH(环境变量)呢,直接用PATH赋值
[root@ying01 ~]# PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:[root@ying01 ~]# !echoecho $PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:
十、cp命令
- cp即copy的简写 ;命令格式为: cp [选项] [来源文件] [目的文件]
- -r : 如果要复制一个目录,必须加-r选项,否则不能复制。
- cp -r 如果目标目录存在的话,则会拷贝到目标目录下的目录里面,如果目标目录不在的话,则会创建目录放置那里。
十一、mv命令
该命令的格式为:mv [选项] [源文件或目录] [目标文件或目录]
该命令有几种情况:
1、目标文件是目录,但该目录不存在;(相当于改名称)[root@ying01 ~]# ls /tmp/ying/ 1.txt 4 5 6[root@ying01 ~]# cd /tmp/ying/ //切换到ying目录下//[root@ying01 ying]# mv 4 7 //把目录4移到未有的目录7// [root@ying01 ying]# ls1.txt 5 6 7 //相当于目录4改名为目录7//
2、目标文件是目录,且目录存在 (移动)
[root@ying01 ying]# mv 5 7 //把目录5移到目录7//[root@ying01 ying]# tree.├── 1.txt├── 6└── 7 └── 53 directories, 1 file
3、目标文件是文件,且该文件不存在 (相当于改名称)
[root@ying01 ying]# mv 1.txt 2.txt //把文件1.txt 移到未有的 2.txt//[root@ying01 ying]# ls2.txt 6 7 //把文件1.txt 替换成 2.txt//
4、目标文件是文件,但该文件存在 (替换)
[root@ying01 ying]# touch 3.txt //新建文件3//[root@ying01 ying]# ls2.txt 3.txt 6 7[root@ying01 ying]# mv 3.txt 2.txt //把文件3复制到2// mv:是否覆盖"2.txt"? y[root@ying01 ying]# ls2.txt 6 7 //其实是文件3,相当于替换//,//
十二、文档查看cat/more/less/head/tail
12.1 cat
cat -A 在行尾加了$作为结束符
参数 -n :显示行数
12.2 more
概念:当文件内容太多,一屏不能全部显示时,用cat是查看不了前面的内容,这时可以使用“Ctrl+B”可以向上翻屏,按Ctrl+F可以向下翻屏(也可以按空格),想退出输入“q”
12.3 less
- 概念:跟more使用的方法一样,后面直接跟文件名;
- less,输入命令,按上下光标键可以查看,按ctrl+B,ctrl+F,向前先后看,按Q退出,
- 在less里面输入/字符串,可以按N查找相应只付出,N往下看,shift+N,可以向前查看;
- less可以实现查找功能,打开一个文档后,输入“/” 后面跟你想要查找的字符串,输入“?”
12.4 head
概念:命令head用于显示文件的前10行,后面直接跟文件名。如果加“-n”选项,则显示文件的前几行。
语法:head /etc/passwd
显示头两行语法: head -n 2 /etc/passwd
12.5 tail命令
概念:和head类似,命令tail用于显示文件的最后10行,直接跟文件名,如果加“-n”,则显示文件的前几行。
语法:tail /etc/passwd
显示最后两行语法:tail -n 2 /etc/passwd
tail-f 查看某个不断在写入的日志文件,head也有此功能;
十三、文件和目录权限chmod
- 目录或文件权限九个字节分为三段,每段三个字节;例:如下表示
- 第一段表示:所有者的权限;
- 第二段表示:所属组的权限;
- 第三段表示:其他用户。
- r:表示是否可读 (数字表示4)
- w:表示是否可写 (数字表示2)
- x:表示是否可执行 (数字表示1)
-rw-r--r--
拿这个做例子,最一开始"rw"前面的“-”这个表示文件或目录类型
1.假设:rw-r--r-x=645,第一段4+2=6,第二段4,第三段5.
这样的话,所有者有可读可写不可执行;所属组拥有可读不可写不可执行,其他用户可读可写可执行
chmod更改权限;
从以上命令看出,chmod只能改变目录或文件本身的权限,而不能改变其下的子目录或子文件
chmod - R 批量修改所有目录或文件
还有一种写法 u= ,g= ,o=
chmod还有一个“a+”“a-”选项参数,给三段都加上权限
十四、更改所有者和所属组chown
概念:chown命令可以更改文件的所有者
命令格式如下: chown [-R] 账户名(root) 文件名 更改文件所有者 chown [-R] 账户名(root):组名(root,中间不加空格) 文件名 -R 选项只适合于目录,作用是级联更改,不仅更改当前目录,连目录里的目录或文件也全部更改
1、chown [-R] 账户名(root) 文件名 更改文件所有者
[root@ying01 ~]# ls3.txt 6 anaconda-ks.cfg NBA[root@ying01 ~]# touch NBA/text //在NBA目录下新建文件text//[root@ying01 ~]# ls -ld NBA/drwxr-xr-x. 2 root root 18 5月 13 20:44 NBA/ //查看目录NBA详细信息//[root@ying01 ~]# chown user1 NBA/ //更改NBA目录的所属主//[root@ying01 ~]# ls -ld NBA/ drwxr-xr-x. 2 user1 root 18 5月 13 20:44 NBA/ //目录NBA所属主已经改为user1//
2、chgrp 改变所属组
chown :root /tmp/yum.log 也变所有组为root[root@ying01 ~]# groupadd user2[root@ying01 ~]# chgrp user2 NBA/[root@ying01 ~]# ls -ld NBA/drwxr-xr-x. 2 user1 user2 18 5月 13 20:44 NBA/
3、chown 所有者:所属组 文件或目录
[root@ying01 ~]# ls3.txt 6 anaconda-ks.cfg NBA [root@ying01 ~]# ls -ld 6/drwxr-xr-x. 2 root root 6 5月 13 18:27 6/[root@ying01 ~]# chown user1:user2 6/[root@ying01 ~]# ls -ld 6/drwxr-xr-x. 2 user1 user2 6 5月 13 18:27 6/
4、chown -R的用法和chmod -R的用法是一样的
[root@ying01 ~]# ls -la NBA/ //查看NBA/目录下所有文件信息//总用量 0drwxr-xr-x. 2 user1 user2 18 5月 13 20:44 .dr-xr-x---. 5 root root 196 5月 13 20:42 ..-rw-r--r--. 1 root root 0 5月 13 20:44 text[root@ying01 ~]# chown -R user1:user2 NBA/ //可以更改当前目录,连目录里的目录或文件全部修改[root@ying01 ~]# ls -la NBA/总用量 0drwxr-xr-x. 2 user1 user2 18 5月 13 20:44 .dr-xr-x---. 5 root root 196 5月 13 20:42 ..-rw-r--r--. 1 user1 user2 0 5月 13 20:44 text //子文件修改成功
十五、umask 确定目录或文件的权限
概念:默认情况下,目录的权限制是755;普通文件的权限制为644. 那么这个值是谁来规定的呢,就是umask。
我们创建新目录新目录8,并创建新文件8,查看它们初始权限;
[root@ying01 ~]# mkdir 8 //创建目录8//[root@ying01 ~]# touch 8/8.txt //在目录8创建文件8//[root@ying01 ~]# ls -ld 8/drwxr-xr-x. 2 root root 19 5月 13 23:32 8/ //查看目录8权限为755//[root@ying01 ~]# ls -l 8/8.txt -rw-r--r--. 1 root root 0 5月 13 23:32 8/8.txt //查看文件8权限为644//
一般新建目录和文件有如下规则:
若用户建立普通文件,则预设没有可执行权限,只有r、w两个权限,rw- rw- rw- (文件的权限)666若用户建立目录,则预设所有权限开放,rwx rwx rwx (目录的权限) 777
但是为什么我们新建的目录和文件分别是755和644呢?此时就涉及到umask
[root@ying01 ~]# umask 0022 //默认为022,一般只看后三位//
则我们不难看出来:
- 默认的目录权限777,umask的值是022,新建目录的权限是755;
- 默认的文件权限666, umask的值是022,新建文件的权限是644;
- 那么新建目录权限:777 -022=755;新建文件的权限:666-022=644
我们再umask设置一个新值:002,看下新建的目录和文件权限:
[root@ying01 ~]# umask 002[root@ying01 ~]# umask0002 //我们设置为002//[root@ying01 ~]# mkdir 9[root@ying01 ~]# touch 9/9.txt[root@ying01 ~]# ls -ld 9/drwxrwxr-x. 2 root root 19 5月 13 23:59 9/ //查看目录9权限为775// [root@ying01 ~]# ls -l 9/9.txt -rw-rw-r--. 1 root root 0 5月 13 23:59 9/9.txt //查看文件9权限为664//
当umask的值为002,此时新建目录权限:777 -002=775;新建文件的权限:666-002=664 ;结果看出来完全吻合;
那umaskd 值为003的时候呢?
[root@ying01 ~]# umask 003 //我们设置为003//[root@ying01 ~]# umask 0003 [root@ying01 ~]# mkdir 10[root@ying01 ~]# touch 10/10.txt[root@ying01 ~]# ls -ld 10/drwxrwxr--. 2 root root 20 5月 14 00:05 10/ //查看目录10权限为774//[root@ying01 ~]# ls -l 10/10.txt -rw-rw-r--. 1 root root 0 5月 14 00:05 10/10.txt //查看文件10权限为664//
那么此时新建目录权限:777 -003=774;新建文件的权限:666-003=663;此时看来不吻合;
其实这个貌似是用数字加减的算法,其实不是直接减去,像umask预设值002、022、003,只是巧合;应该按下面做减法;
666-003 = (rw-rw-rw-)-(--------wx)=rw-rw-r--=664777-003 = (rwxrwxrwx)-(--------wx)=rwxrwxr----=774