touch 创建文件

创建文件有许多种方式,例如用vi创建文件,利用重定向创建文件。

语法: touch [-acm] [-t time] file…

作用: 创建文件,改变文件的修改时间和访问时间。

-m 改变修改时间

-a 改变访问时间

-t 用一个具体的时间去替换

如果不加参数会将修改时间和访问时间全部修改。

例如: touch * ,这个命令会修改目录下的所有文件的访问时间和修改时间。

如果后面接的文件名不存在,touch将会创建一个文件。

-c 不创建文件。如果文件存在,会修改时间,如果文件不存在,不进行操作。

文件命名

要求:

  1. 文件名最长是255个字符
  2. 文件名可以包含除了/外的任何字符

虽然说创建文件名的时候没有太多的要求,但是最好创建有意义的名字并且不要实用一些特殊字符。例如-,虽然创建的时候不会出现问题,但是使用命令进行操作的时候却会带来麻烦。

cp 复制文件

语法: cp [-ip] file1 file2

file1是已有文件 file2是目标文件

例如: cp /etc/passwd ~/pword

这个命令会复制passwd文件到pword中,如果pword不存在,那么就会创建。这时需要特别小心,如果目标文件存在,那么复制完之后原来的内容咩有办法找回。

如果想追加数据,则不能用cp,只能用cat重定向追加内容。

cp很容易错误的清楚数据,为了保险起见,可以用-i选项。这个选项会在替换已有文件时先询问。可以在初始化文件中直接设定。

还有一个选项是-p,这个命令使目标文件和原文件有相同的修改时间访问时间和权限。

-r,将一个目录复制到另一个目录中。

将文件复制到不同目录中

就是将file2变成directory。

mv 移动文件

在前面博客中已经提到

rm 删除文件

语法: rm [-fir] file…

rm删除同样是不可恢复的。为了防止误删文件,可以使用-i选项,每次删除之前请求许可。

-f 强制删除文件,不考虑权限和-i。

-r 删除整个目录树,这个选项会将从工作目录开始的所有文件全部删除

文件权限

权限一共有三种,读权限,写权限,执行权限。这些权限和用户标识也有关,如果是普通用户,可能对一些文件没有写权限和执行权限。

设置权限有两个目的,限制其他用户的访问和避免自己错误的使用。

下面是权限的作用

文件
读取文件(没有这个权限使用命令也无法查看文件)
写入文件,没有写权限的话在删除和替换时都会先询问
执行 执行文件
目录
读取(查看)目录
创建、移动、复制或删除目录
执行 搜索目录

例如,有这个文件的写权限和执行权限,那么无法看到它(也就是点文件),但是如果知道它的位置,还是可以对他进行操作。

id groups 维护文件权限

创建文件的用户标识就是文件的属主。每个用户都属于一个组,第二组是组中其他人,第三组是其他人,可以为这三组设置读写和执行权限。

系统中组标识的列表在/etc/group中,这个文件可以自由查看

id就是用来查看当前用户标识和属于那个组的。groups命令是同样的作用。

ls -l显示文件权限

使用-l时,从左边开始会有一些字符。例如-rwx等等

首先第一个字符是-或者d,-代表普通文件,d代表目录。之后会有9个字符分成3组,分别代表个人权限,族权限,其他人权限。

除了这种表示方法,还可以用三个数字表示三中类型的权限

  • r: 读权限 数字 4
  • w: 写权限 数字 2
  • x: 执行权限 数字 1
  • -: 没有权限 数字 0

例如只有读写权限,那么就可以用6来代表。

改变文件权限

可以使用chmod(change file mode)来改变文件权限

语法: chmod mode file…

这里的mode是使用数字表示的,并且一次要写三种类型。

例如: chmod 644 file1

umask 可以改变默认权限,例如umask 022.则写权限变成0。umask444则所有读权限变成0.普通文件默认权限是644,目录文件默认权限是777.通过umask044,则普通文件默认权限变成600.

shred 清空文件内容

前面讲的rm命令只是删除了文件,但是文件所在的空间还是可以重新被使用的。甚至这个时候如果用昂贵的设备,那么其中的内容还是可以恢复的。如果使用了shred,那么就会毁坏硬盘(后备隐藏能源?),这时数据就永远无法恢复了。这里就不展开了。

stat ls -i 链接的概念

当linux创建文件时,进行两个操作。在储存设备上保留一块空间来保存数据,之后创建一个索引节点(i节点)来存放数据的基本信息。i节点包含使用文件所需的全部信息

stat命令就是查看i节点的内容

所有的i节点存放于一个大表中,称为i节点表。在节点表中,每个i节点由索引号和i节点号表示。为了查看节点号,可以使用ls -i选项。如果想查看所有节点,可以使用ls -il。

处理目录时,其实我们处理的是i节点号和节点名称。所以目录实际上很小。只有一个名称,每一个名称对应一个i节点号。

例如,我们现在bin目录中创建swap文件。那么先保留一块空间,如果查看i节点表,查找一个空闲的i节点。然后linux将信息填充到属于这个文件的i节点中。之后在bin目录中放入一个条目,该条目有名称和i节点号。

文件名和i节点之间的连接叫链接。

多重链接,一个文件,多个名字

多重链接就是一个文件可以有不同的名称。因为文件标识实际上是i节点号,我们从目录中查询的时候也是查询i节点号然后根据节点号中的信息去访问。因此我们可以在不同目录中创建指向同一个节点号的文件,这其实就是快捷方式。

ln 创建新链接

语法: ln file newname

作用:每当创建文件时,系统都会自动在文件和文件名间创建一个链接。如果我们想为已有文件创建一个新链接,就可以用ln(link)。

我们也可以将newname改成directory,那么就是创建快捷方式

移除链接

直接用rm命令即可,除非所有链接都被删除,不然文件不会被删除。

符号链接 ln -s

前面讲的链接有两点限制。一,不能为目录创建链接。二,不能为不同文件系统创建链接。(因为目录没有i节点)

如果想克服上述情况,就需要创建符号链接。符号链接包含的不是文件的i节点号,而是原文件的路径名。

但是用ls -l时,左边会有一个l代表链接。实际符号链接在右边。用一个->符号后面加上指向的真实文件名表示。因为符号链接只存一个路径,所以大小也只有4字节。注意这是符号链接才会有->符号,一般的链接不会显示。

一般的链接叫做硬链接,就是起了一个别名。符号链接叫做软链接,实际上并不是存放那个文件,只是存放一个指向文件的地址。

硬链接数量ls -l可以显示,但是软链接无法显示,因为系统也不知道有多少软链接。并且当文件被删除时,软链接也不会被删除,只是打开时发生错误

目录使用符号链接

当我们对目录使用符号链接之后,cd时到底应该显示真实的目录还是符号链接目录呢?实际上两种都可以。

如果使用cd -L选项,将把符号链接视为真实目录,使用-P选项将用真实目录替换符号链接,也就是直接进入真实目录。默认情况是-L。

我们使用-L情况是和-P一样的,使用-L时目录显示与原文件相同,就是实际对源文件进行操作的时候想要进行跳转。

locate 通过数据库查看文件

语法: locate [-bcirS] pattern…

作用: 在一个特殊的数据库(包含所有的可公共访问的文件,且定期更新)查找文件。

如果想使用正则表达式,可以使用-r选项 ,可以用^和$表示开头和结尾。

例如 locate -r ‘.jpg$’ 是找jpg图片

locate -ir ‘^/usr*x11$’ 是找以/usr开头,x11结尾的。

  • -c 统计数目,而不显示位置
  • -i 忽略大小写

find 搜索目录树查找文件

语法: find path… test… action…

输入命令后,find执行三步

  1. 路径,先查看每个路径,检查这个路径代表的整个目录树
  2. 测试,对于遇到的每个文件,find用指定的测试条件进行测试,成功就进行下一步
  3. 动作,一旦搜索完成,对成功通过上面两个步骤的文件做的操作

例如: find /home/harley -name important -print

路径: /home/harley。表示从harley目录开始进行搜索,也就是home目录不搜索。路径可以有多个

动作: -name important。这个的含义是查找名字是important的文件

动作: -print。输出路径名

测试

下列是一些模式

文件名
-name pattern 包含pattern的文件名
-iname pattern 不区分大小写
文件特征
-type [df] 文件类型 d:目录 f:普通文件
-perm mode 文件权限
-user userid 文件属主
-group groupid 组为groupid
-size [-+]n[cbkMG] 大小为n[字节,块,kb,mb,gb]
-empty 空文件
访问时间,修改时间
-amin [-+]n n分钟之前访问,-是小于这个时间
-atime [-+]n n天之前访问
-anewer file file之后访问
-cmin [-+]n n分钟之前状态改变
-cnewer file file状态改变之后改变
-time [-+]n
-mmin [-+]n n分钟之前修改
-mtime [-+]n n天之前修改
-newer file file文件之后修改

最重要的是type和name。中括号中的加减号代表的是大于和小于。

type控制查找那些类型。除了上面的之外,还有b(块设备),c(字符设备),p(命名管道),l(符号链接)

例如: find . -type f -name important -print

其中name后面的pattern可以用通配符。

cmin代表的是访问或修改。

例如: find ~ -cmin -10 -print

这个的含义是查找10分钟内被访问或修改的文件。

使用!对测试求反

使用!时要注意两个问题:

  1. !号两边要有空格
  2. 必须要引用!,可以\!,也可以’!’

并且一个感叹号只对一个测试有效。

动作

动作
-print 将路径名写入标准输出
-fprint file 将输出写入file中
-ls 显示长目录列表,和ls -l输出样式差不多
-fls file 输出写入file中
-delete 输出文件
-exec command {} \; 执行command,{}指示匹配的文件名
-ok command {} \; 同exec,在执行command前先确认

exec后面的command是linux的程序例如ls,echo等。这条命令以;(封号)结尾,前面的\是转义字符。而{}有些系统必须要加转义字符。

例如: find . -name '*.backup' -exec ls -dils {} \;

xargs 处理查找到的文件

对于查找到的文件可以用exec处理,但是这里专门有一个程序去处理。

语法: xargs [-prt] [-i string] [command | argument…]

command是希望运行的程序,string是占位符,argument是从标准输入中读取的参数。

例如: find ~ -type f | xargs ls -s

如果想多次运行同一命令,那么需要使用-i选项,并且后面要使用 { }作为占位符,占位符在命令开始之前会被参数替代。

例如: find . -type f | xargs -i echo { } { }

这条命令将会连续输出两次。如果想自己指定占位符,可以直接在-i后面添加字符串。

例如: find . -type f | xargs -iXX mv XX ~/backups/XX.old

这条命令即移动又进行了重命名(变成XX.old)

-p 运行命令之前先提示

-t 运行命令不会请求许可但是会显示在标准输出中。

-r 如果没有参数,则不执行。

例如: find . -empty | xarg -r ls -l

原本如果是没有空文件的话ls将会输出整个目录,这当然不对,所以没有空文件的时候就可以让他忽略。