Linux零基础入门第五课

文件的基本操作(下)

文件属性

file命令
语法
>$ file file0 [file1 file2 ...]

file命令用于确认文件的类型。
Linux下,通常并不会严格按照文件扩展名来确定文件的类型,尤其是可执行程序往往是没有扩展名的。
file命令可以查看文件的具体类型,如果是可执行程序,还会显示其位数、链接信息等数据,如下所示:

>$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=d0bc0fb9b3f60f72bbad3c5a1d24c9e2a1fde775, stripped
stat命令
语法
>$ stat file0 [file1 file2]

stat命令用来查看文件的详细属性,类似于ls -l,但它们又有所不同,我们通过一个例子来详解各个指标。

>$ stat /bin/ls
  File: '/bin/ls'
  Size: 126584      Blocks: 248        IO Block: 4096   regular file
Device: 805h/2053d  Inode: 980781      Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-06-12 21:03:56.231999815 +0800
Modify: 2017-03-03 02:07:22.000000000 +0800
Change: 2018-02-06 15:52:08.189466243 +0800
 Birth: -

File:文件名。
Size:文件的大小,单位是字节。
Blocks:文件占用了多少个数据块。(注意磁盘是块设备,数据是按块为基本单位存储的,而不是按照字节为基本单位。)
IO Block:每个块能够存储多少字节的数据。
regular file:这个字段是文件的类型。regular file 表示这是一个普通文件。
Device:设备号。
Inode:文件的Inode号。Inode是文件系统在磁盘上用来保存文件属性数据的,里面包含了除了文件名以外的所有文件属性。而文件名是保存在目录文件中的,目录也是文件,它是用来保存文件的特殊文件。
Links:文件的硬链接数量。
Access:文件权限。
Uid:文件属主。
Gid:文件属组。
Access Time:又称atime,表示文件的访问时间。当文件的内容被访问时更新此时间戳。
Modify Time:又称mtime,表示文件的修改时间。当文件的内容被修改时更新此时间戳。
Change Time:又称ctime,表示文件状态修改时间。当文件的状态(或属性)被修改时更新此时间戳,例如修改权限、创建或删除硬链接等等。

文件权限

chmod命令
语法
>$ chmod [-R] mask name

chmod命令是用来修改文件的权限的。
在 Linux 系统中,任何一个文件都可以被分配三个权限,即可读可写可执行
而每个用户对一个文件而言都至少拥有下面三个身份中的一个,即文件的拥有者与文件拥有者在相同的用户组其他用户
那么这三个权限与三个身份之间有着什么样的联系呢,我们且先看一下某个文件的属性。

>$ ls -l /bin/ls
-rwxr-xr-x 1 root root 126584 3月   3  2017 /bin/ls

文件/bin/ls的属性中,第一个字段-rwxr-xr-x就表示文件的类型和权限,我们在后面进行详细介绍。接下来看第三和第四两个字段,均为root。第一个root表示文件归属于哪个用户,下文称其为文件的“属主”。第二个root表示文件归属于哪个用户组,下文称其为文件的“属组”。其它的字段与权限无关,我们这里就不展开介绍了。
接下来我们先解释第一个字段的含义,把-rwxr-xr-x分为四个部分来解读,如下表所示:
| 段 | 含义 |
| :-: | - |
| - | 文件类型 |
| rwx | 属主的权限 |
| r-x | 属组的权限 |
| r-x | 其他用户的权限 |
表1 权限段

图1 文件权限
文件类型中的-表示这是一个普通文件,常见的文件类型见下表:
| 标识符 | 类型 |
| :-: | - |
| d | 文件夹 |
| - | 普通文件 |
| l | 符号链接 |
| p | 管道文件 |
| b | 块设备文件 |
| c | 字符设备文件 |
| s | 套接字文件 |
表2 文件类型
文件权限部分共出现了4种字符,分别表示不同的权限,如下表所示:
| 标识符 | 八进制权重 | 权限 |
| :-: | :-: | - |
| r | 4 | 可读 |
| w | 2 | 可写 |
| x | 1 | 对文件表示可执行,对文件夹表示可进入 |
| - | 0 | 无此权限 |
表3 权限值
由此我们可以解读出-rwxr-xr-x表示:

这是一个普通文件;
文件的所有者对其拥有可读、可写、可执行的权限;
与文件所有者在相同用户组的用户对其拥有可读、可执行的权限;
其它用户拥有可读、可执行的权限。

文件权限的八进制表示法

权限中的 owner、group、other 的每一部分的权限分别可以计算出一个八进制值,三个八进制值合并在一块就可以表示一个文件的完整权限。
如表3所示,不同的权限对应着一个权重值,将每一部分权限的权重值相加就可以得到这一部分的权重。
还用上面的/bin/ls文件的权限为例,它的八进制权限计算过程如下:

(r w x) (r - x) (r - x)
(4+2+1) (4+0+1) (4+0+1) = 7 5 5

因此-rwxr-xr-x对应的八进制权限就是755

chmod的用法

有了前面的知识,我们就可以看下chmod命令的用法的。它在修改文件权限的时候既可使用八进制的形式也可使用标识符的形式来指示权限。

使用八进制方式修改文件的权限

我们通过下面的例子使用八进制的方式将/bin/ls文件的权限修改为“属主可读、属组可读写、其他用户可执行”:

>$ $ sudo chmod 461 /bin/ls
>$ ls -l /bin/ls
-r--rw---x 1 root root 126584 3月   3  2017 /bin/ls

461权限对应的标识符是什么呢,大家可以根据前面学到的知识计算一下。

使用标识符的形式修改文件的权限

使用标识符的形式修改文件的权限,需要分别指定为哪个组别的用户修改权限,组别使用下表的字符来表示:
| 标识符 | 组别 |
| :-: | - |
| a | 所有用户 |
| u | 属主 |
| g | 属组 |
| o | 其他用户 |
表4 组别标识符
使用表4中的组别标识符和表3的权限标识符组合,就可以修改对应组别的权限了。
通过下面的例子,我们将/bin/ls文件的权限修改为“属主拥有可读、可写、可执行的权限;属组和其它用户均拥有可读和和执行的权限”。

>$ ls -l /bin/ls
-r--rw---x 1 root root 126584 3月   3  2017 /bin/ls

>$ sudo chmod u+wx /bin/ls
>$ ls -l /bin/ls
-rwxrw---x 1 root root 126584 3月   3  2017 /bin/ls

>$ sudo chmod g-w /bin/ls
>$ ls -l /bin/ls
-rwxr----x 1 root root 126584 3月   3  2017 /bin/ls
>$ sudo chmod g+x /bin/ls
>$ ls -l /bin/ls
-rwxr-x--x 1 root root 126584 3月   3  2017 /bin/ls

>$ sudo chmod o+r /bin/ls
>$ ls -l /bin/ls
-rwxr-xr-x 1 root root 126584 3月   3  2017 /bin/ls

上例中每一次修改我们都可以看到对应的权限发生了变化。
使用标识符来修改权限的一个常见的场景是在创建脚本的时候,出于安全方面的考量,一般情况使用touch命令创建一个脚本文件后,该文件并不具备可执行的权限,我们需要手动为所有的用户都添加上可执行的权限,那么可以按照如下方式方便的授权:

>$ touch test.sh
>$ ls -l test.sh
-rw-rw-r-- 1 user user 0 6月  27 20:42 test.sh
>$ chmod a+x test.sh
>$ ls -l test.sh
-rwxrwxr-x 1 user user 0 6月  27 20:42 test.sh

从这个例子中可以清楚的看到,使用a+x很方便的为所有的用户添加了可执行权限。

如果要递归为目录中的子文件修改权限,只需添加-R参数即可,如下所示:

>$ chmod 777 -R /tmp/17bang
>$ chmod a+x -R /tmp/17bang
chown命令

此命令用于修改文件或目录的属主,也可同时修改属组。

>$ chown user[:group] [-R] dir/file

通过上面chmod命令我们知道了,文件的所有者和用户所在的用户组会决定一个用户对某个文件具有什么样的权限,那么chown命令就是用来修改一个文件的属主属组的。
使用示例:

>$ ls -l 17bang.txt
-rw-rw-r-- 1 user user 0 7月   5 18:51 17bang.txt
>$ sudo chown root 17bang.txt
>$ ls -l 17bang.txt
-rw-rw-r-- 1 root user 0 7月   5 18:51 17bang.txt
>$ sudo chown root:root 17bang.txt
>$ ls -l 17bang.txt
-rw-rw-r-- 1 root root 0 7月   5 18:51 17bang.txt

注意:chown命令只有超级用户才能使用。
试想一下为什么会有这样的限定呢?
举个栗子来说,如果任何用户都可以使用chown命令来修改文件的所有者,那么就可以轻易绕过磁盘配额的控制了。
假设管理员为用户A分配了一定的磁盘空间,当用户A的磁盘空间不足时,ta就可以通过chown命令将某些文件的所有者修改为另一个用户B,这样这笔账就寄在用户B的头上了。当用户A需要使用此文件时,再将所有者改回来就行了。而用户B却完全不知道自己在用户A的家目录中还有所属的文件,白白的为用户A背了锅。

chgrp命令

此命令专门用来修改文件和目录的属组,用法与chown类似,这里就不再展开介绍了。

查找文件

whichlocatefind命令是三个常见的查找文件的命令,下面我们分别进行介绍。

which命令

which是 shell 的内建命令,通常用于查找某个命令的路径,因为它只从$PATH环境变量所指定的路径中寻找文件。

>$ which ls
/bin/ls
locate命令

locate命令从/var/lib/mlocate/mlocate.db数据库文件中查询文件的所在路径,因此检索速度非常快。
系统会在特定的时间自动调用updatedb命令来更新这个数据库文件,因此locate命令并不能查询到系统中最新添加的文件,而是要等待一定的时间后才能查询得到。

>$ locate .vimrc
/home/user/.vimrc

-c参数可以统计数量。
-i参数可以忽略大小写。

find命令

find命令是所有查找命令中最常用也最强大的,它不仅可以通过文件名来查询,也可以通过文件类型和属性来查找文件。

>$ find [path] [expression]

我们这里只举个用文件名查找文件的栗子。

>$ find /etc -name "*.conf"
/etc/depmod.d/ubuntu.conf
/etc/rsyslog.conf
/etc/sensors3.conf
/etc/ca-certificates.conf
......

如果不加路径,则默认为查找当前目录下的文件。

$ find -name "*.txt"
./.mozilla/firefox/s7tyv1vj.default-1530780643269/SiteSecurityServiceState.txt
./.mozilla/firefox/s7tyv1vj.default-1530780643269/pkcs11.txt

find命令还有许多其它高级的用法,大家可以试着自己找找资料,并动手实验一下。

上面的内容不过瘾?更深入的知识可以参考LZ的博客:(三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

原文地址:https://www.cnblogs.com/0xcafebabe/p/9270169.html

时间: 2024-08-01 12:45:37

Linux零基础入门第五课的相关文章

Linux零基础入门第四课

根据直播讲义整理的内容,从第四课开始.前三课的内容若后面有精力会一并整理进来. 文件的基本操作(上) 创建.删除.复制.移动和重命名 touch命令创建文件 语法 >$ touch file0 [file1 file2 ...] >$ touch file{0..9}.txt touch命令可以创建空文件,将文件名作为参数即可.传递多个文件名可同时创建多个文件. 若使用 file{0..9} 作为参数,将自动创建10个空文件,名字分别为file0.txt.file1.txt.....file9

Android零基础入门第18节:EditText的属性和使用方法

EditText与TextView非常相似,它甚至与TextView 共用了绝大部分XML属性和方法.EditText与TextView的最大区别在于:EditText可以接受用户输入. 一.EditText简介 EditText支持的XML属性及相关方法见TextView表中介绍的与输入有关的属性和方法,其中比较重要的一个属性是inputType,用于为EditText设置输入类型,其属性值主要有以下一些. android:inputType=none:普通字符. android:inputT

Android零基础入门第64节:揭开RecyclerView庐山真面目

大家还记得之前在第38期~第50期都在学习列表控件吗,其中用了8期讲ListView的使用,相信都已经掌握好了吧.那么本期一起来学习Android 5.X新增的一个列表组件,那就是RecyclerView的使用. 一.RecyclerView概述 从前面的学习我们知道,ListView的功能非常强大,几乎绝大部分应用程序都会使用到,虽然也学会一些方法技巧来提升ListView的效率,但其性能还是不是很完美. 另外ListView的可扩展性相对来说比较弱,以前要实现每个列表项的高度不同的界面,或者

Android零基础入门第61节:滚动视图ScrollView

原文:Android零基础入门第61节:滚动视图ScrollView 前面几期学习了ProgressBar系列组件.ViewAnimator系列组件.Picker系列组件和时间日期系列组件,接下来几期继续来学习常见的其他组件. 一.ScrollView概述 从前面的学习有的同学可能已经发现,当拥有很多内容时屏幕显示不完,显示不全的部分完全看不见.但是在实际项目里面,很多内容都不止一个屏幕宽度或高度,那怎么办呢?那就需要本节学习的ScrollView来完成. 在默认情况下,ScrollView只是

Android零基础入门第60节:日历视图CalendarView和定时器Chronometer

原文:Android零基础入门第60节:日历视图CalendarView和定时器Chronometer 上一期学习了AnalogClock.DigitalClock和TextClock时钟组件,本期继续来学习日历视图CalendarView和定时器Chronometer. 一.CalendarView 日历视图(CalendarView)可用于显示和选择日期,用户既可选择一个日期,也可通过触 摸来滚动日历.如果希望监控该组件的日期改变,则可调用CalendarView的 setOnDateCha

Android零基础入门第62节:搜索框组件SearchView

原文:Android零基础入门第62节:搜索框组件SearchView 一.SearchView概述 SearchView是搜索框组件,它可以让用户在文本框内输入文字,并允许通过监听器监控用户输入,当用户输入完成后提交搜索时,也可通过监听器执行实际的搜索. SearchView默认是展示一个search的icon,点击icon展开搜索框,也可以自己设定图标.用SearchView时可指定如下表所示的常见XML属性及相关方法. 如果为SearchView增加一个配套的ListView,则可以为Se

Android零基础入门第16节:Android用户界面开发概述

相信通过前面15期的学习,Android的开发环境已经基本掌握了,如果仍有问题,欢迎到Android零基础入门技术讨论微信群交流,从本期开始正式来一步一步踏入Android开发之路. Android应用开发的一项内容就是用户界面的开发.Android提供了非常丰富的用户界面组件,借助于这些用户界面组件,开发者可以非常方便地进行用户界面开发,而且可以开发出非常优秀的用户界面. 一.界面UI元素介绍 Android应用是运行于手机系统上的程序,这种程序给用户的第一印象就是用户界面.接下来从以下几个方

Android零基础入门第58节:数值选择器NumberPicker

原文:Android零基础入门第58节:数值选择器NumberPicker 上一期学习了日期选择器DatePicker和时间选择器TimePicker,是不是感觉非常简单,本期继续来学习数值选择器NumberPicker . 一.NumberPicker概述 NumberPicker 是用于选择一组预定义好数字的组件,用户既可以通过键盘输入数值,也可以通过滚动来选择数值. NumberPicker的常用方法如下: setMinValue(int minVal):设置该组件支持的最小值. setM

Android零基础入门第40节:自定义ArrayAdapter

ListView用起来还是比较简单的,也是Android应用程序中最重要的一个组件,但其他ListView可以随你所愿,能够完成很多想要的精美列表,而这正是我们接下来要学习的内容. 一.自定义ArrayAdapter 从上期自定义列表项示例知道,每个列表项的图标都一样,如果需要每个列表项的图标根据内容动态表示,Android系统的ArrayAdapter就无能为力了,就只能使用自定义ArrayAdapter来实现啦. 做法就是创建一个ArrayAdapter的子类,重写其getView()方法,