Linux文件操作
touch 创建文件
创建文件有许多种方式,例如用vi创建文件,利用重定向创建文件。
语法: touch [-acm] [-t time] file…
作用: 创建文件,改变文件的修改时间和访问时间。
-m 改变修改时间
-a 改变访问时间
-t 用一个具体的时间去替换
如果不加参数会将修改时间和访问时间全部修改。
例如: touch * ,这个命令会修改目录下的所有文件的访问时间和修改时间。
如果后面接的文件名不存在,touch将会创建一个文件。
-c 不创建文件。如果文件存在,会修改时间,如果文件不存在,不进行操作。
文件命名
要求:
- 文件名最长是255个字符
- 文件名可以包含除了/外的任何字符
虽然说创建文件名的时候没有太多的要求,但是最好创建有意义的名字并且不要实用一些特殊字符。例如-,虽然创建的时候不会出现问题,但是使用命令进行操作的时候却会带来麻烦。
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执行三步
- 路径,先查看每个路径,检查这个路径代表的整个目录树
- 测试,对于遇到的每个文件,find用指定的测试条件进行测试,成功就进行下一步
- 动作,一旦搜索完成,对成功通过上面两个步骤的文件做的操作
例如: 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分钟内被访问或修改的文件。
使用!对测试求反
使用!时要注意两个问题:
- !号两边要有空格
- 必须要引用!,可以
\!
,也可以’!’
并且一个感叹号只对一个测试有效。
动作
动作 | |
---|---|
将路径名写入标准输出 | |
-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将会输出整个目录,这当然不对,所以没有空文件的时候就可以让他忽略。