文件是用于存储数据的,数据信息都是写入文件中的。在Linux系统中有各种各样的文件类型,相对目录而言,文件名一般有后缀名。本节将会介绍一些常用的文件操作命令,如文件的增、删、改、查等命令。当然,Linux系统关于文件的命令不止本节所介绍的这些,本节介绍的是一些使用率较高的命令。
stat命令用于显示文件或目录的详细属性信息,包括文件系统状态,其比ls命令显示的信息更加详细。这里需要重点看3个时间,其中,Access表示最近访问的时间,Modify表示最近修改的时间,包括修改文件内容和修改文件权限,Change表示最近修改文件权限的时间。命令格式如下:
stat 文件或目录
下面的示例演示查看/root目录下的文件信息。
#查看/root目录下anaconda-ks.cfg文件的相关属性信息 [root@localhost ~]# stat /root/anaconda-ks.cfg File: ‘anaconda-ks.cfg’ Size: 1763 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 33574978 Links: 1 Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root) Context: system_u:object_r:admin_home_t:s0 Access: 2020-11-29 17:25:18.484346323 +0800 Modify: 2020-11-29 17:22:53.157303040 +0800 Change: 2020-11-29 17:22:53.157303040 +0800 Birth: -
touch命令用于新建空白文件或更新文件的时间标记。当文件不存在时表示创建空文件,当文件存在时则表示更新文件的时间标记。使用touch命令也可以同时创建多个空文件。命令格式如下:
touch 选项 文件名
touch命令在使用时一般不需要选项,但这里仍然罗列出几个选项供读者参考,具体说明如下:
·-a:只更改访问时间。
·-c:不创建任何文件。
·-d:使用指定字符串表示时间而非当前时间。
·-m:只更改修改时间。
下面的示例是对以上选项用法的详细演示,注意查看显示结果。
#在/opt目录下同时新建1.txt和2.txt两个文件 [root@localhost opt]# touch 1.txt 2.txt [root@localhost opt]# ls 1.txt 2.txt rh #批量新建多个文件,使用{a..z}或{1..10}连续集合的方式表示,也可以使用{文件名1, 文件名2,……}取值列表的方式表示 [root@localhost opt]# touch {a.txt,b.txt} [root@localhost opt]# ls 1.txt 2.txt a.txt b.txt rh [root@localhost opt]# touch {x..z}.txt [root@localhost opt]# ls 1.txt 2.txt a.txt b.txt rh x.txt y.txt z.txt #当文件存在时表示对文件的时间标记进行更新,先使用ls命令查看1.txt文件的详细信息(主 要看时间),然后使用touch命令,再通过ls命令查看时间是否发生了变化 [root@localhost opt]# ls -lh 1.txt -rw-r--r--. 1 root root 0 12月 2 22:06 1.txt [root@localhost opt]# touch 1.txt [root@localhost opt]# ls -lh 1.txt -rw-r--r--. 1 root root 0 12月 2 22:16 1.txt
这里补充一个知识点,引入两个通配符号的概念。符号“*”表示匹配0个或多个字符,符号“?”表示匹配1个字符。如果忘记文件或目录名称的全称,只能记住大概的名称,就可以使用通配符进行模糊查询操作。示例如下:
#在/opt目录下同时新建1.txt、12.txt、123.txt 3个文件,其他txt文件已删除 [root@localhost opt]# touch {1,12,123}.txt [root@localhost opt]# ls 123.txt 12.txt 1.txt a test1 test2 test3 #使用符号“*”模糊查询所有的txt文件,这里“*”分别匹配了0个、1个和2个字符 [root@localhost opt]# ls 1*.txt 123.txt 12.txt 1.txt #使用符号“?”查询txt文件中以1开头并且后面只有一个字符的文件 [root@localhost opt]# ls 1?.txt 12.txt
cp是Copy的简写,cp命令用于复制文件或目录。命令格式如下:
cp 选项 源文件或目录 目标文件或目录
下面列出几个cp命令中使用频率较高的选项进行说明,同样,短选项也可以多个一起使用。
·-r:递归复制整个目录树,复制目录时必须使用该选项。
·-p:保持源文件的属性不变。
·-f:强制覆盖与目标文件或目录同名的文件或目录,即覆盖时不提示。
·-i:如果存在与目标文件或目录同名的文件或目录,覆盖时提示。
下面的示例是对以上选项用法的详细演示,注意查看显示结果。
#将/opt目录下所有的txt文件复制到/opt/test1目录下,test1目录是空目录 [root@localhost opt]# cp /opt/*.txt /opt/test1 [root@localhost opt]# ls /opt/test1 1.txt 2.txt a.txt b.txt x.txt y.txt z.txt #使用选项“-i”,即目标文件存在,覆盖时给出提示 [root@localhost opt]# cp -I /opt/*.txt /opt/test1 cp:是否覆盖"/opt/test1/1.txt"? …… #使用选项“-f”,即目标文件存在,覆盖时不提示。执行时发现还是会提示,这是因为默认有个 别名记录,应先使用unalias命令取消别名记录后再执行 #查看别名记录 [root@localhost opt]# alias alias cp='cp -i' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias rm='rm -i' alias which='alias |/usr/bin/which --tty-only --read-alias --show-dot --show-tilde' #使用unalias命令取消cp的别名记录,发现cp命令默认就是使用“cp -i” [root@localhost opt]# unalias cp #再次使用“cp -f”时就不会有提示了 [root@localhost opt]# cp -f /opt/*.txt /opt/test1 #使用“-r”选项将整个/opt/test1目录复制到/opt/test2目录下,注意格式,即test2后 面一定记得接上“/”才是复制到test2目录下,如果后面不接“/”,则表示复制test1后重 命名为test2 [root@localhost opt]# cp -rf /opt/test1 /opt/test2/ [root@localhost opt]# ls /opt/test2/ test1 #复制时接上选项“-p”,可以保持源文件属性不变。先使用ls命令查看文件的时间标记,复制 后再查看时间标记时会发现没有发生变化,表示复制时源文件的属性保持不变 #ls查看源文件的时间标记 [root@localhost opt]# ls -lh /opt/2.txt -rw-r--r--. 1 root root 0 12月 2 22:06 /opt/2.txt #不使用选项“-p”复制后发现时间发生了改变 [root@localhost opt]# cp /opt/2.txt /opt/test3/ [root@localhost opt]# ls -lh /opt/test3/2.txt -rw-r--r--. 1 root root 0 12月 4 21:27 /opt/test3/2.txt #使用选项“-p”复制后发现时间和原来的时间保持一致 [root@localhost opt]# cp -p /opt/2.txt /opt/test2 [root@localhost opt]# ls -lh /opt/test2/2.txt -rw-r--r--. 1 root root 0 12月 2 22:06 /opt/test2/2.txt
rm是Remove的简写,rm命令用于删除文件或目录。命令格式如下:
rm 选项 文件或目录
rm命令常用的选项如下:
·-f:强行删除文件或目录并且不提醒。
·-i:删除文件或目录时提醒用户确认。
·-r:递归删除整个目录树,删除目录时必须使用该选项。
rm命令的选项和cp命令的选项作用相同,这里就不一一演示了。
注意:在使用管理员账户root时不建议使用rm -rf命令删除文件或目录,以防止出现误删除。
mv是Move的简写,mv命令用于剪切或重命名文件或目录。当源路径和目标路径不一致时实现的是剪切功能,也可以在剪切后直接重命名;当源路径和目标路径一致时实现的是重命名功能。命令格式如下:
mv 源文件或目录 目标文件或目录
mv命令常用的选项如下:
·-f:若目标文件存在,则覆盖前不提示。
·-i:若目标文件存在,则覆盖前给出提示。
·-n:不覆盖已存在的文件。
下面的示例是对以上选项用法的详细演示,注意查看显示结果。
#将/opt目录下的1.txt文件剪切到/opt/test4目录下,因为源路径和目标路径不一致,因此 实现的是剪切功能 [root@localhost opt]# mv /opt/1.txt /opt/test4/ #将/opt目录下的test2重命名为66.txt,因为源路径和目标路径一致,因此实现的是重命名 功能,此处使用的是相对路径 [root@localhost opt]# ls 2.txt rh test4 [root@localhost opt]# mv 2.txt 66.txt [root@localhost opt]# ls 66.txt rh test4
1.which命令
which命令用于在PATH环境变量中指定路径,定位与指定名字匹配的可执行命令的所在路径,同时也可以判断该命令是否存在。其中,选项“-a”表示返回匹配名字的可执行命令的所有路径。命令格式如下:
which 命令字
下面的示例是对which命令的演示,注意查看显示结果。
#使用echo命令查看PATH环境变量 [root@localhost ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin #使用which命令定位ls命令的路径,后面跟不跟选项“-a”结果都一样 [root@localhost ~]# which ls alias ls='ls --color=auto' /usr/bin/ls [root@localhost ~]# which -a ls alias ls='ls --color=auto' /usr/bin/ls #使用cp命令将ls命令复制到/usr/sbin目录下,再使用which命令进行测试 [root@localhost ~]# cp /usr/bin/ls /usr/sbin/ [root@localhost ~]# which ls alias ls='ls --color=auto' /usr/sbin/ls [root@localhost ~]# which -a ls alias ls='ls --color=auto' /usr/sbin/ls /usr/bin/ls
2.whereis命令
whereis命令用于对程序名的搜索。如果后面不跟任何选项,则默认搜索二进制文件、帮助文件和源代码文件中的所有信息。命令格式如下:
whereis 选项 文件名
whereis命令常用的选项如下:
·-b:只搜索二进制文件。
·-m:只搜索帮助文件。
·-s:只搜索源代码文件。
下面是对whereis命令的演示。
#使用whereis命令查找ls命令的所有相关文件 [root@localhost ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin #使用whereis命令只查找ls命令的二进制文件 [root@localhost ~]# whereis -b ls ls:/usr/bin/ls/usr/sbin/ls #使用whereis命令只查找ls命令的帮助文件 [root@localhost ~]# whereis -m ls ls:/usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
3.find命令
find命令用于在整个磁盘中搜索文件,查找速度较慢。命令格式如下:
find 路径名 选项 查询结果处理动作
find命令根据选项不同实现的功能也不同,常用的选项如下:
·-name:通过文件名进行搜索。
·-type:通过文件类型进行搜索。其中:b表示块设备文件;c表示字符设备文件;d表示目录;f表示普通文件;l表示符号链接文件;p表示管道文件;s表示套接字文件。
·-size:通过文件大小进行搜索。其中:b表示字节;k表示KB;M表示MB;G表示GB。
·-user:通过文件所属者进行搜索。
·-group:通过文件所属组进行搜索。
·-perm:按照文件权限进行搜索。符号“-”表示每个对象必须同时匹配指定的权限,可以多但是不能少;符号“+”(CentOS 6以下版本,CentOS 7以上的版本中是“/”符号)表示每个对象只要匹配指定权限中的一个即可;不使用符号表示每个对象必须完全匹配指定的权限。
·-ctime:通过最近修改时间(这里指的是修改文件权限的时间)进行搜索,“+n”表示修改时间与当前时间差大于n×24小时,“-n”表示修改时间与当前时间差小于n×24小时,n表示修改时间与当前时间差大于(n-1)×24小时且小于等于n×24小时。
·-mtime:通过最近修改时间(这里指的是修改文件内容和权限的时间)进行搜索,后面的数字n和选项-ctime的用法一致。
·-atime:通过最近访问时间进行搜索,后面的数字n也和ctime中的用法一致。
下面的示例是对以上选项的详细演示,注意查看显示结果。
#查找/opt目录下所有的txt文件。可以先在/opt目录下批量新建txt文件,包括二级子目录 [root@localhost opt]# find /opt -name "*.txt" -type f /opt/test4/1.txt /opt/test4/123.txt /opt/66.txt /opt/a.txt /opt/b.txt /opt/c.txt /opt/d.txt /opt/e.txt /opt/f.txt #查找/etc目录下大于80KB且小于100KB的文件,选项“-a”或“-and”表示逻辑与(同时满 足多个条件),选项“-o”或“-or”表示逻辑或(只需要满足一个条件) [root@localhost ~]# find /etc -size +80k -and -size -100k -type f /etc/ld.so.cache /etc/lvm/lvm.conf /etc/vmware-tools/vgauth/schemas/XMLSchema.xsd [root@localhost ~]# ls -lh /etc/ld.so.cache -rw-r--r--. 1 root root 84K 12月 2 22:34 /etc/ld.so.cache #查找/home目录下3天前修改的所有的txt文件,并将它们全部复制到/opt/a目录下 #方法一:“| xargs”表示将前面的结果交给后面的命令进行处理,“-i”表示逐行处理,“{}” 表示前面查找的结果的集合 [root@localhost /]# find /home -name "*.txt" -type f -mtime +3 | xargs -i cp {} /opt/a #方法二:“-exec”也是将前面的结果交由后面的命令进行处理,“{}”表示前面查找的结果 的集合,“\;”是“-exec”结尾的格式,不能缺少 [root@localhost ~]# find /home -name "*.txt" -type f -mtime +3 -exec cp {} /opt/a \;
4.locate命令
locate命令相当于“find 路径 -name”的用法,相对于find命令,该命令的查询速度更快,它是在后台对系统数据库(/var/lib/locatedb)进行搜索,它的缺点是刚创建的文件无法立即查询到,原因是将文件写入系统数据库中需要时间,这个时间是一天,即系统数据库每天会自动更新一次。如果需要避免此情况,可以在使用locate命令之前,先使用updatedb命令手动更新系统数据库。命令格式如下:
locate 文件或目录
下面是locate命令的演示。
#查找带有“1.txt”名称的所有文件和目录,模糊匹配 [root@localhost ~]# locate 1.txt /etc/brltty/brl-ts-pb65_pb81.txt /etc/pki/nssdb/pkcs11.txt /home/1.txt /home/zhangsan/.cache/tracker/parser-sha1.txt /opt/test4/1.txt ……
5.type命令
type命令其实不属于搜索命令,它用于区分一个命令是内部命令还是外部命令,查询的结果中若带有builtin,则查询命令为内部命令,否则为外部命令。外部命令可以继续细分,带有alias的是别名,带有keyword的是关键字,带有file的是外部命令。如果一个命令是外部命令,那么使用“-P”参数会显示该命令的路径,相当于which命令。命令格式如下:
type 命令字
下面是type命令的演示说明。
#cd属于内部命令 [root@localhost home]# type cd cd is a shell builtin #ls属于外部命令,使用选项“-P”查看命令的绝对路径 [root@localhost home]# type ls ls is aliased to `ls --color=auto' [root@localhost home]# type -P ls /usr/bin/ls #if属于shell脚本中的关键字 [root@localhost home]# type if if is a shell keyword
ln是Link的简写,ln命令用于为文件或目录创建链接文件,方便提高查找文件的效率。链接文件分为软链接文件和硬链接文件,下面分别进行介绍。
1.软链接文件
软链接又称为符号链接,相当于在Windows环境下创建快捷方式,无论修改哪个文件,另外一个文件都会跟着发生改变。删除软链接文件对原始文件无影响,反之则有影响。可以使用“ls -lhi”查看详细信息,如果为软链接文件,则在显示结果中可以看到第二列中的第一个字符为“l”,最后一列显示“->”并且显示的颜色为青色(浅蓝色)。软链接文件和源文件的索引节点号是不一样的,其命令格式如下:
ln -s 源文件或目录 链接文件或目录
下面是创建软链接文件的演示。
#将/etc/hosts文件软链接到/opt/hosts的文件中 [root@localhost ~]# ln -s /etc/hosts /opt/hosts #使用ls命令查看详细信息 [root@localhost ~]# ls -lhi /opt/hosts 34942400 lrwxrwxrwx. 1 root root 10 12月 6 11:05 /opt/hosts ->/etc/hosts
2.硬链接文件
硬链接文件可以理解为Windows环境下的复制文件,不同的是在使用Linux的硬链接文件时,无论修改哪个文件,另外一个文件都会发生变化,删除一个文件对另外一个文件都无影响且无法硬链接目录。区分硬链接文件也可以使用“ls -lhi”查看详细信息,第一列的索引节点号和源文件是一致的,第三列的文件数量正常情况下为1,而硬链接文件的数量是大于1的。命令格式如下:
ln 源文件 链接文件
下面创建硬链接文件的演示说明。
#将/etc/hosts文件硬链接到/opt/hardhosts文件中 [root@localhost ~]# ln /etc/hosts /opt/hardhosts #使用ls命令查看两个文件的详细信息,注意看第一列的索引节点号和第三列的文件数量 [root@localhost ~]# ls -lhi /etc/hosts 16778618 -rw-r--r--. 2 root root 158 6月 7 2013 /etc/hosts [root@localhost ~]# ls -lhi /opt/hardhosts 16778618 -rw-r--r--. 2 root root 158 6月 7 2013 /opt/hardhosts
注意:创建链接文件时必须在同一分区下,且必须采用绝对路径。