Linux 文件管理及目录与权限控制
前言
事实上提到对文件及目录管理时,我认为无法避免会说到用户及用户组.所以在这个主题下先提及一下.
Linux可以实现多用户登陆,这些用户可以共享一些文件,但他们也都有自己的空间.实际上他们的文件都是放在同一个物理磁盘甚至同一个目录的.这就是因为用户管理与权限机制。
所以有些文件,我们可能无法进行更改,后面会提到.
输入1
who am i
可以查看当前用户
root账户权限最高,可以对其他用户文件进行删改
sudo 命令提升权限,否则一些命令可能无法执行
这个命令会常用
sudo #使用这个命令需要知道当前登陆用户密码且该用户在sudo用户组内.
用户组就是若干个用户在一起的组合,其他用户就是既不是本身用户也不是这个用户组里的用户.
文件及目录的管理
有了些基本知识就可以对文件进行操作了
Linux目录结构与Windows不同,以目录为主.可以理解为树形目录是一个用户可操作系统的骨架。虽然本质上无论是目录结构还是操作系统内核都是存储在磁盘上的,但从逻辑上来说 Linux 的磁盘是挂载在目录上的,每一个目录不仅能使用本地磁盘分区的文件系统,也可以使用网络上的文件系统。
Linux目录配置依据 FHS。根据这个标准,Linux的目录该放那些文件是有规定的
关于目录树
绝对路径: 由根目录/开始写起的文件名或目录名称
相对路径:相对于目前路径的文件名写法
# 绝对路径
cd /usr/local/bin
相对路径
cd ../../usr/local/bin
cd 改变当前目录
- 找到文件/目录位置:cd
- 切换到上一个工作目录: cd -
- 切换到home目录: cd or cd ~
- 显示当前路径: pwd
更改当前工作路径为
1
path: $cd path
.. 表示上一级目录
. 表示当前目录
现在可以开始对文件的查看了
命令
- 创建目录:mkdir
- 删除:rm
- 删除非空目录:rm -rf file目录
- 删除日志 rm log (等价: $find ./ -name “log” -exec rm {} ;)
- 移动:mv
- 复制:cp (复制目录:cp -r )
- 创建文件:touch
新建
touch 创建空白文件
mkdir 新建目录
我们发现如果想创建多层的目录直接使用mkdir不行,需要 mkdir -p
同时一个目录下文件不能与文件夹同名
复制
使用 cp命令(copy)复制一个文件到指定目录
文件的复制。默认复制文件的数据
复制目录
直接使用cp复制目录会出错
加上参数 -r 递归复制1
$cp -r source_dir dest_dir
常用参数
-f :为强制 (force) 的意思,若有重复或其它疑问时,不会询问使用者,而强制复制;
-i :若目的文件(destination)已经存在时,在覆盖时会先询问是否真的动作!
-l :进行硬链接 (hard link) 建立,而非复制档案本身;
-p :连同档案的属性(权限,时间,用户)一起复制过去,而非使用预设属性;
-r :递归持续复制,用于目录的复制行为;
-d:复制成为符号连接
默认情况下,cp后目标文件拥有者是命令执行者.如果想要连着这个属性更改需要加上-p
复制时需要考虑:
保留源文件完整信息?
源文件是否是符号链接
源文件是否是mulu
删除
使用 rm
(remove files or directories)命令删除一个文件
当然 不能删除本身不存在的文件
有时候你会遇到想要删除一些为只读权限的文件,直接使用 rm
删除会显示一个提示,加上 -f参数直接强制删除
-i 在删除前会询问
删除目录
同样的,需要加上-r参数才能删除目录
其实也可以使用rmdir,但只能删除空目录
移动
使用mv命令移动文件1
mv source destination
重命名文件
mv
命令除了能移动文件外,还能给文件重命名。命令格式为 mv 旧的文件名 新的文件名
。
文件权限
Unix/Linux 系统是一个典型的多用户系统,不同的用户处于不同的地位,对文件和目录有不同的访问权限。为了保护系统的安全性,Unix/Linux 系统除了对用户权限作了严格的界定外,还在用户身份认证、访问控制、传输安全、文件读写权限等方面作了周密的控制。
在 Unix/Linux 中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录。
查看文件与目录
之前也用到很多次 ls命令
ls列出目录下的文件
-a 显示所有文件及目录(包含以“.”开头的隐藏文件)
-l 显示详细文件内容,长格式
-h 与-l一起使用,输出易于阅读的文件大小。 Human-readable
-r 将文件以相反次序显示(原定以英文字母次序)
-d 若不加参数指定目录,ls会列出目录中的内容,若与-l结合则可以查看目录信息
-t 安修改日期排序输出
-S 按文件大小排序输出
我们会发现 在长格式下,文件前面会有一些东西
分别是 文件类型权限 链接数 文件所属用户组 文件大小Byte 文件最后修改时间 文件名 (当然后面可能会有软链接)
关于权限
读权限,表示你可以使用 cat <file name>
命令来读取某个文件的内容;写权限,表示你可以编辑和修改某个文件的内容;
执行权限,通常指可以运行的二进制程序文件或者脚本文件,如同 Windows 上的 exe
后缀的文件,不过 Linux 上不是通过文件后缀名来区分文件的类型。你需要注意的一点是,一个目录同时具有读权限和执行权限才可以打开并查看内部文件,而一个目录要有写权限才允许在其中创建其它文件,这是因为目录文件实际保存着该目录里面的文件的列表等信息。
可以分析一下,这是个目录(d) 拥有者与用户组权限都是rwx,即可读可写可执行. 但其他用户不能写,说明其他用户不能改写该目录.所有者与所属用户组为shiyanlou
更改权限
chgrp:修改文件所属用户组
chown:修改文件拥有者
-R 参数递归修改连通目录下的所有文件
chomd:修改文件的权限
- 改变文件的拥有者 chown
- 改变文件读、写、执行等属性 chmod
- 递归子目录修改: chown -R tuxapp source/
- 增加脚本可执行权限: chmod a+x myscript
注意 用户组在 etc/group里。用户在etc/passwd里
实例
创建用户,在该用户目录下创建ipone文件。发现该文件所有者是lilei
现在切回root
发现该文件所有者变为shiyanlou
现在是更改了文件的所有者,下面继续更改所属用户组
这样的话lilei就只有rx的权限了,也就是说无法更改文件.我们试一试
会发现无法修改…
接下来进行修改权限
二进制数字表示
第一位指定属主的权限,第二位指定组权限,第三位指定其他用户的权限,每位通过4(读)、2(写)、1(执行)三种数值的和来确定权限。如6(4+2)代表有读写权,7(4+2+1)有读、写和执行的权限。
例如
可以发现改为了拥有者可读可写
符号操作
1
userMark取值:
- u:用户
- g:组
- o:其它用户
- a:所有用户
PermissionsMark取值:
- r:读
- w:写
- x:执行
+
和 -
分别表示增加和去掉相应的权限。
在shell中,要修改文件当前的用户必须具有管理员root的权限。可以通过su命令切换到root用户,也可以通过sudo获得root的权限
注意:对于文件和文件夹来说。 rwx权限不太一样
文件:r 读取文件内容 w修改文件内容 x执行文件内容
目录:r 读到文件名 w修改文件名 x进入目录权限
也就是说若没有x权限,无法进入目录(不代表不能知道目录下的东西)
实例
创建一个目录 然后更改权限 使得用户组与其他用户只有r权限
使用groups查看当前用户的用户组。发现他加入了多个用户组
然后想要进入该目录权限不够,因为只有r
sudo大法 更改权限进入文件
添加一个文件
发现可以查询目录下的文件名列表但无法切换到目录内。甚至无法读取文件内容
file确定文件类型
Linux下不要求文件名反应文件类型,使用file命令可以查看类型
less查看文本文件
我们可以上下翻页。q退出
cat
cat命令用于连接文件并打印到标准输出设备上。
我写在这里是因为这些命令用的挺多的
把 textfile1 的文档内容加上行号后输入 textfile2 这个文档里:1
cat -n textfile1 > textfile2
把 textfile1 和 textfile2 的文档内容加上行号(空白行不加)之后将内容附加到 textfile3 文档里:1
cat -b textfile1 textfile2 >> textfile3
查看文件:cat vi head tail more
显示时同时显示行号:1
$cat -n
按页显示列表内容:1
ls -al | more
只看前10行:1
head - 10 **
显示文件第一行:1
head -1 filename
显示文件倒数第五行:1
tail -5 filename
查看两个文件间的差别:1
diff file1 file2
动态显示文本最新信息:1
tail -f crawler.log
链接
Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接
在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的
软链接
也叫符号链接
与Windows的快捷方式类似
在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。1
ln -s cc ccTo :符号链接(软链接);删除源,另一个无法使用;(后面一个ccTo 为新建的文件)
ls -li -i可以显示inode节点。通过这个判断链接。当然,符号链接inode不同且有箭头指向被链接的文件.
若源文件被删,则符号链接的文件也失效
硬链接
它与软链接实现方式不同
硬链接指通过索引节点来进行连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的链接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
硬链接f2到f1,将f1删掉.因为节点相同,发现原本软链接到f1的f3硬链接到了f2
删除被软链接的文件,在创建同名文件,发现软链接的文件更新了
文件压缩与解压
在 Windows 上最常见的不外乎这两种 *.zip
,*.7z
后缀的压缩文件。而在 Linux 上面常见的格式除了以上两种外,还有 .rar
,*.gz
,*.xz
,*.bz2
,*.tar
,*.tar.gz
,*.tar.xz
,*.tar.bz2
,
Linux 常用的压缩与解压缩命令有:tar、gzip、gunzip、bzip2、bunzip2、compress 、uncompress、 zip、 unzip、rar、unrar 等
文件后缀名 | 说明 |
---|---|
*.zip | zip 程序打包压缩的文件 |
*.rar | rar 程序压缩的文件 |
*.7z | 7zip 程序压缩的文件 |
*.tar | tar 程序打包,未压缩的文件 |
*.gz | gzip 程序(GNU zip)压缩的文件 |
*.xz | xz 程序压缩的文件 |
*.bz2 | bzip2 程序压缩的文件 |
*.tar.gz | tar 打包,gzip 程序压缩的文件 |
*.tar.xz | tar 打包,xz 程序压缩的文件 |
*tar.bz2 | tar 打包,bzip2 程序压缩的文件 |
*.tar.7z | tar 打包,7z 程序压缩的文件 |
简单来说,就是打包,压缩
tar
打包
最常用的打包命令是 tar,使用 tar 程序打出来的包我们常称为 tar 包,tar 包文件的命令通常都是以 .tar 结尾的。生成 tar 包后,就可以用其它的程序来进行压缩了
tar实现了对 7z、gzip、xz、bzip2 等工具的支持,这些压缩工具本身只能实现对文件或目录(单独压缩目录中的文件)的压缩,没有实现对文件的打包压缩.
下来来介绍参数
-c 创建一个tar包 -f指定文件名
-r 增加文件1
sudo tar -cf mytar.tar file
创建了一个tar包
还可以加上 -v
参数以可视的的方式输出打包的文件。
1
tar -uf all.tar logo.gif
更新原来 tar 包 all.tar 中 logo.gif 文件,-u 是表示更新文件的意思1
tar -tf all.tar
列出 all.tar 包中所有文件,-t 是列出文件的意思
- 保留文件属性和跟随链接(符号链接或软链接),有时候我们使用 tar 备份文件当你在其他主机还原时希望保留文件的属性(
-p
参数)和备份链接指向的源文件而不是链接本身(-h
参数):
1 | tar -cphf etc.tar /etc |
解包
解包一个文件(-x
参数)到指定路径的已存在目录(-C
参数)
只查看不解包文件 -t
参数
压缩与解压
对于创建不同的压缩格式的文件,对于 tar 来说是相当简单的,需要的只是换一个参数
在创建 tar 文件的基础上添加 -z
参数1
sudo tar -czf mytar.tar.gz file
解压文件使用 -xzf (对于gzip)
压缩文件格式 | 参数 |
---|---|
*.tar.gz | -z |
*.tar.xz | -J |
*tar.bz2 | -j |
zip
其实光tar已经够了,这里稍微写一下zip
-r
参数表示递归打包包含子目录的全部内容
-q
参数表示为安静模式,即不向屏幕输出信息
-o
,表示输出文件
还可以设置压缩等级
zip -r -o myzip.zip file
du用于查看文件大小
-e设置密码
-l 用于使LF转化为CR+LF. 也就是linux换行符为LF在windows上无法显示
unzip用于解压
-q 安静模式
-d 指定输出到的目录
-l 不解压只查看内容
中文压缩包 -O GBK 指定编码类型
小结
- zip:
- 打包 :zip something.zip something (目录请加 -r 参数)
- 解包:unzip something.zip
- 指定路径:-d 参数
- tar:
- 打包:tar -cf something.tar something
- 解包:tar -xf something.tar
- 指定路径:-C 参数
补充
find
实时查找
搜寻文件或目录:1
$find ./ -name "core*" | xargs file
查找目标文件夹中是否有obj文件:1
$find ./ -name '*.o'
指定目录 与 -name查找关键字(可用正则)
递归当前目录及子目录删除所有.o文件:1
$find ./ -name "*.o" -exec rm {} \;
locate
locate会为文件系统建立索引数据库,如果有文件更新,需要定期执行更新命令来更新索引库。1
$locate string
寻找包含有string的路径:1
$updatedb
与find不同,locate并不是实时查找。你需要更新数据库,以获得最新的文件索引信息。