2.23-2.26 查找文件和文件名后缀

在Linux下搜一个文件

1、‘which’ 用来查找可执行文件的绝对路径

which只能用来查找PATH环境变量中出现的路径下的可执行文件。这个命令用的也是蛮多的,有时候我们不知道某个命令的绝对路径,which 一下很容易就知道了。

2、‘whereis’ 通过预先生成的一个文件列表库去查找跟给出的文件名相关的文件。

语法: whereis [-bmsu]  [文件名称]

‘-b’ : 只找binary 文件

‘-m’ : 只找在说明文件manual路径下的文件

‘-s’ : 只找source来源文件

‘-u’ : 没有说明档的文件

说明:whereis平时不常用,因为搜索不精准。

3、‘locate’ 类似于’whereis’, 也是通过查找预先生成的文件列表库来告诉用户要查找的文件在哪里。

后边直接跟文件名。如果我们的linux没有这个命令,请安装软件包 ‘mlocate’,如果使用的是centos,可以使用这个命令来安装 yum install -y  mlocate。

这是因为系统还没有生成那个文件列表库。可以使用 updatedb 命令立即生成(更新)这个库。如果服务器上正跑着重要的业务,那么最好不要去运行这个命令,因为一旦运行,服务器的压力会变大。这个数据库默认情况下每周更新一次。所以用locate命令去搜索一个文件,正好是在两次更新时间段内,那肯定是得不到结果的。可以到/etc/updated.conf 去配置这个数据库生成(更新)的规则。’locate’所搜索到的文件列表,不管是目录名还是文件名,只要包含我们要搜索的关键词,都会列出来,所以’locate’不适合精准搜索,这个命令也不常用。

4、find命令,最常用的搜索命令。

语法 : find  [路径] [参数]

选项:

====================================================

-name   filename             #查找名为filename的文件

-perm                        #按执行权限来查找

-user    username             #按文件属主来查找

-group groupname            #按组来查找

-mtime   -n +n                #按文件更改时间来查找文件,-n指n天以内,+n指n天以前

-atime    -n +n               #按文件访问时间来查GIN: 0px">

-ctime    -n +n              #按文件创建时间来查找文件,-n指n天以内,+n指n天以前

-nogroup                     #查无有效属组的文件,即文件的属组在/etc/groups中不存在

-nouser                     #查无有效属主的文件,即文件的属主在/etc/passwd中不存

-newer   f1 !f2              找文件,-n指n天以内,+n指n天以前 

-ctime    -n +n               #按文件创建时间来查找文件,-n指n天以内,+n指n天以前 

-nogroup                     #查无有效属组的文件,即文件的属组在/etc/groups中不存在

-nouser                      #查无有效属主的文件,即文件的属主在/etc/passwd中不存

-newer   f1 !f2               #查更改时间比f1新但比f2旧的文件

-type    b/d/c/p/l/f         #查是块设备、目录、字符设备、管道、符号链接、普通文件

-size      n[c]               #查长度为n块[或n字节]的文件

-depth                       #使查找在进入子目录前先行查找完本目录

-fstype                     #查更改时间比f1新但比f2旧的文件

-type    b/d/c/p/l/f         #查是块设备、目录、字符设备、管道、符号链接、普通文件

-size      n[c]               #查长度为n块[或n字节]的文件

-depth                       #使查找在进入子目录前先行查找完本目录

-fstype                      #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到

-mount                       #查文件时不跨越文件系统mount点

-follow                      #如果遇到符号链接文件,就跟踪链接所指的文件

-cpio                %;      #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到

-mount                       #查文件时不跨越文件系统mount点

-follow                      #如果遇到符号链接文件,就跟踪链接所指的文件

-cpio                        #对匹配的文件使用cpio命令,将他们备份到磁带设备中

-prune                       #忽略某个目录

用法:

======================================================

find   -name april*                     在当前目录下查找以april开始的文件

find   -name   april*   fprint file        在当前目录下查找以april开始的文件,并把结果输出到file中

find   -name ap* -o -name may*   查找以ap或may开头的文件

find   /mnt   -name tom.txt   -ftype vfat   在/mnt下查找名称为tom.txt且文件系统类型vfat的文件

find   /mnt   -name t.txt ! -ftype vfat   在/mnt下查找名称为tom.txt且文件系统类型不为vfat的文件

find   /tmp   -name wa* -type l            在/tmp下查找名为wa开头且类型为符号链接的文件

find   /home   -mtime   -2                 在/home下查最近两天内改动过的文件

find /home    -atime -1                  查1天之内被存取过的文件

find /home -mmin    +60                  在/home下查60分钟前改动过的文件

find /home   -amin   +30                  查最近30分钟前被存取过的文件

find /home   -newer   tmp.txt             在/home下查更新时间比tmp.txt近的文件或目录

find /home   -anewer   tmp.txt            在/home下查存取时间比tmp.txt近的文件或目录

find   /home   -used   -2                  列出文件或目录被改动过之后,在2日内被存取过的文件或目录

find   /home   -user cnscn                列出/home目录内属于用户cnscn的文件或目录

find   /home   -uid   +501                  列出/home目录内用户的识别码大于501的文件或目录

find   /home   -group   cnscn              列出/home内组为cnscn的文件或目录

find   /home   -gid 501                   列出/home内组id为501的文件或目录

find   /home   -nouser                    列出/home内不属于本地用户的文件或目录

find   /home   -nogroup                   列出/home内不属于本地组的文件或目录

find   /home    -name tmp.txt    -maxdepth   4   列出/home内的tmp.txt 查时深度最多为3层

find   /home   -name tmp.txt   -mindepth   3   从第2层开始查

find   /home   -empty                     查找大小为0的文件或空目录

find   /home   -size   +512k                查大于512k的文件

find   /home   -size   -512k               查小于512k的文件

find   /home   -links   +2                查硬连接数大于2的文件或目录

find   /home   -perm   0700                查权限为700的文件或目录

find   /tmp   -name tmp.txt   -exec cat {} \;

find   /tmp   -name   tmp.txt   -ok   rm {} \;

find    /   -amin    -10     # 查找在系统中最后10分钟访问的文件

find    /   -atime   -2        # 查找在系统中最后48小时访问的文件

find    /   -empty             # 查找在系统中为空的文件或者文件夹

find    /   -group   cat        # 查找在系统中属于 groupcat的文件

find    /   -mmin   -5         # 查找在系统中最后5分钟里修改过的文件

find    /   -mtime   -1       #查找在系统中最后24小时里修改过的文件

find    /   -nouser           #查找在系统中属于作废用户的文件

find    /   -user    fred     #查找在系统中属于FRED这个用户的文件

常用参数:

‘-atime +n/-n’ : 访问或执行时间大于/小于n天的文件。

‘-ctime +n/-n’ : 写入、更改inode属性(例如更改所有者、权限或者链接)时间大于/小于n天的文件。

‘-mtime +n/-n’ : 写入时间大于/小于n天的文件。

三个time属性:

文件的 Access time也就是 ‘atime’ 是在读取文件或者执行文件时更改的。文件的 Modified time也就是 ‘mtime’ 是在写入文件时随文件内容的更改而更改的。文件的 Create time也就是 ‘ctime’ 是在写入文件、更改所有者、权限或链接设置时随inode的内容更改而更改的。 因此,更改文件的内容即会更改mtime和ctime,但是文件的ctime可能会在 mtime 未发生任何变化时更改,例如,更改了文件的权限,但是文件内容没有变化。 如何获得一个文件的atime mtime 以及ctime ?

‘stat’ 命令可用来列出文件的 atime、ctime 和 mtime

atime不一定在访问文件之后被修改,因为:使用ext3文件系统的时候,如果在mount的时候使用了noatime参数那么就不会更新atime的信息。总之, 這三個 time stamp 都放在 inode 中。若 mtime, atime 修改inode 就一定會改, 既然 inode 改了, 那 ctime 也就跟着要改了。

‘-name filename’ 直接查找该文件名的文件,这个选项使用很多

在tmp下搜索txt后缀的文件:

‘-type filetype’ 通过文件类型查找


Linux文件类型与扩展名

PS:在linux下,我们可以定义一个文件的后缀名,如.txt和.log这种,但它并不像windows那样,是这个后缀名就等于是这种文件。只是后缀名而已。

列如:我们touch新建了一个文件起名为1.doc,但是放在windows里并不能用word打开它,所以后缀并不能定义一个文件的类型,有时候只是为了好区分。

 

文件种类

 

最前面的标志(d或 -)可以表示目录或文件,那就是不同的文件种类。Linux的文件种类主要有下面这几种:

 

• 普通文件(regular file):就是一般我们存取的文件,由ls -al显示出来的属性中,第一个属性为 [-],例如 [-rwxrwxrwx]。另外,依照文件的内容,又大致可以分为:

• 纯文本文件(ASCII):这是Unix系统中最多的一种文件类型,之所以称为纯文本文件,是因为内容为我们可以直接读到的数据,例如数字、字母等等。设置文件几乎都属于这种文件类型。举例来说,使用命令“cat ~/.bashrc”就可以看到该文件的内容(cat是将文件内容读出来)。

• 二进制文件(binary):我们在GNU发展史中提过,系统其实仅认识且可以执行二进制文件(binary file)。Linux中的可执行文件(脚本,文本方式的批处理文件不算)就是这种格式的。举例来说,命令cat就是一个二进制文件。

• 数据格式的文件(data):有些程序在运行过程中,会读取某些特定格式的文件,那些特定格式的文件可以称为数据文件(data file)。举例来说,Linux在用户登入时,都会将登录数据记录在 /var/log/wtmp文件内,该文件是一个数据文件,它能通过last命令读出来。但使用cat时,会读出乱码。因为它是属于一种特殊格式的文件。

• 目录(directory):就是目录,第一个属性为 [d],例如 [drwxrwxrwx]。

• 连接文件(link):类似Windows下面的快捷方式。第一个属性为 [l],例如 [lrwxrwxrwx]。

• 设备与设备文件(device):与系统外设及存储等相关的一些文件,通常都集中在 /dev目录。通常又分为两种:

• 块(block)设备文件:就是存储数据以供系统存取的接口设备,简单而言就是硬盘。例如一号硬盘的代码是 /dev/hda1等文件。第一个属性为 [b]。

• 字符(character)设备文件:即串行端口的接口设备,例如键盘、鼠标等等。第一个属性为 [c]。

• 套接字(sockets):这类文件通常用在网络数据连接。我们可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。第一个属性为 [s],最常在 /var/run目录中看到这种文件类型。

• 管道(FIFO, pipe):FIFO也是一种特殊的文件类型,它主要的目的是,解决多个程序同时存取一个文件所造成的错误。FIFO是first-in-first-out(先进先出)的缩写。第一个属性为 [p]。

那么,使用“ls -al”命令,就可以简单通过判断每一个文件的第一个属性来了解这个文件是何种类型。

除了设备文件是系统中很重要的文件,最好不要随意修改之外(通常它也不会让你修改),另一个比较有趣的文件就是连接文件。如果常常将应用程序放到桌面,就应该知道在Windows下面有所谓的“快捷方式”。同样,可以将Linux 下的连接文件简单视为一个文件或目录的快捷方式。套接字与管道文件比较难理解,因为它们与进程(process)密切相关,到将来了解进程(第17章)之后,再回来查看吧。此外,也可以通过man fifo及man socket来查看系统说明。

Linux文件扩展名

基本上,Linux文件是没有“扩展名”的,我们知道,Linux文件能否执行,与它第一列的10个属性有关,与文件名一点关系也没有。这与Windows不同。在Windows中,能执行的文件扩展名通常是 .com、.exe、.bat等等,而在Linux中,只要属性中有x,例如 [-rwx-r-xr-x] 即表示这个文件可以执行。

不过,可以执行与可执行成功是不一样的。举例来说,在root家目录下的install.log是一个纯文本文件,如果修改权限成为 -rwxrwxrwx后,这个文件能执行吗?当然不行。因为它的内容根本就没有可执行的数据。所以说,x表示这个文件具有可执行的能力,但能不能执行成功,当然就要看该文件的内容。

虽然扩展名没有什么实际的帮助,不过,由于我们仍然希望可以通过扩展名来了解该文件是什么,所以,通常还是会以适当的扩展名来表示该文件是什么类型。下面有数种常用的扩展名:

• *.sh:批处理文件(scripts,脚本),因为批处理文件使用shell写成,所以扩展名就编成 .sh。

• *Z, *.tar, *.tar.gz, *.zip, *.tgz:经过打包的压缩文件。这是因为压缩软件分别为gunzip、tar等等的,根据不同的压缩软件而取其相关的扩展名。

• *.html, *.php:网页相关文件,分别表示HTML语法与PHP语法的网页文件。.html的文件可使用网页浏览器来直接打开, .php的文件则可以通过客户端的浏览器来浏览服务器端,以得到运算后的网页结果。

 

Linux文件名的限制

 

 一般来说,在设置Linux下的文件名时,最好避免一些特殊字符。例如下面这些:

* ? > < ; & ! [ ] | / ' " ` ( ) { }

因为这些符号在命令行界面下是有特殊意义的。另外,文件名的开头为小数点“.”时,表示这个文件为“隐藏文件”。同时,由于命令中常常会使用 -option之类的参数,所以最好也避免将文件名的开头以 - 或 来命名。