必 备 习 题 集 ( 六 )

1. find 查找某个时间段的文件 


在一个目录下,有很多很多文件,只想找到12月1日至12月31日的文件,如何找呢?

 先手动找到在这个时间段最早的文件,比如1.txt是12月1日0点1分创建的,再找到这个时间段最晚的文件,比如2.txt是12月31日23点55分创建的;

 find  . -type f -newer 1.txt ! -newer 2.txt


不去手动找,参考下面:

其实也就是修改文件的创建日期(mtime)。 touch就有这个功能。

例 新建一个2012年10月8日的文件

touch -m -t 1210080000 1.txt


然后stat 1.txt 

发现除了Modify 那一行为2012年10月8日0点0分外,其他两项均为当前日期和时间


还可以

touch -c -t 1210080000 2.txt

stat 2.txt

Access 和 Modify 均为2012年10月8日0点0, Change 为当前日期和时间



2. 创建指定日期的文件  


其实也就是修改文件的创建日期(mtime)。 touch就有这个功能。
例 新建一个2012年10月8日的文件
touch -m -t 1210080000 1.txt

然后stat 1.txt 
发现除了Modify 那一行为2012年10月8日0点0分外,其他两项均为当前日期和时间

还可以
touch -c -t 1210080000 2.txt
stat 2.txt
Access 和 Modify 均为2012年10月8日0点0, Change 为当前日期和时间


3. 用find时排除某些目录或者文件  



1.  只排除一个目录或者文件,如查找/tmp/ 目录下所有文件(不包含目录), 并且不包含目录123

find  /tmp/   -path "/tmp/123" -prune -o -type f  -print


2. 排除两个或者多个目录或者文件,如查找/tmp/ 目录下所有文件(不包含目录), 并且不包含目录123和目录234和目录345

find  /tmp/ \( -path "/tmp/123" -o -path "/tmp/234" -o -path "/tmp/345" \) -prune -o -type f -print


注意,如果是查找目录时,-path 后面的目录名一定不要带/  如 写成  -path "/tmp/123/" 就错了,而查找文件时,带/ 没有问题。




4. 为你的linux增加自定义PATH  


把mysql安装在 /usr/local/mysql 下。如果要是用mysql这个命令,我们不得不敲绝对路径/usr/local/mysql/bin/mysql,这样太费劲。

那么就把 /usr/local/mysql/bin 加入到 PATH变量中。

vi  /etc/profile

在最后面加入

export  PATH=$PATH:/usr/local/mysql/bin

报存后,运行命令

source  /etc/profile 

检查PATH变量

echo $PATH

这样就可以直接输入mysql 了。



5. linux下文件的特殊权限s和t  



先看看这两个文件的权限:

[root@localhost ~]# ls -ld /usr/bin/passwd  /tmp

drwxrwxrwt 4 root root  4096 Jun  2 17:33 /tmp

-rwsr-xr-x 1 root root 22984 Jan  7  2007 /usr/bin/passwd


这里的s和t是针对执行权限来讲的。

这个s权限,是为了让一般使用者临时具有该文件所属主/组的执行权限。就比如/usr/bin/passwd在执行它的时候需要去修改/etc/passwd和/etc/shadow等文件,这些文件除了root外,其他用户都没有写权限,但是又为了能让普通用户修改自己的密码,只能时临时让他们具有root的权限。所以这个s权限就是用来完成这个特殊任务的。s权限只能应用在二进制的可执行文件上。

如果你不想让普通用户修改自己的密码,只需要

[root@localhost ~]# chmod u-s /usr/bin/passwd  或者

[root@localhost ~]# chmod 0755 /usr/bin/passwd

0755最前面的0表示不使用任何特殊权限,该位上的数字可以是0,1(--t),2(-s-),3(-st),4(s--),5(s-t),6(ss-),7(sst)

那个t权限只针对目录生效,它表示只能让所属主以及root可以删除(重命名/移动)该目录下的文件。比如/tmp目录本来就是任何用户都可以读写,如果别人可以任意删除(重命名/移动)自己的文件,那岂不是很危险。所以这个t权限就是为了解决这个麻烦的。下面举一个例子,说明一下这个权限的用法:

[root@localhost ~]# cd /tmp/

[root@localhost tmp]# mkdir test

[root@localhost tmp]# chmod 1777 test

[root@localhost tmp]# ls -ld test

drwxrwxrwt 2 root root 4096 Jun  2 18:10 test

[root@localhost tmp]# su test1

[test1@localhost tmp]$ touch test/1.txt

[test1@localhost tmp]$ ls -l test

total 4

-rw-r--r-- 1 test1 test 0 Jun  2 18:12 1.txt

[test1@localhost tmp]$ exit

[root@localhost tmp]# su www

[www@localhost tmp]$ ls -l test/1.txt

-rwxrwxrwx 1 test1 test 6 Jun  2 18:12 test/1.txt

[www@localhost tmp]$ rm test/1.txt

rm: cannot remove `test/1.txt': Operation not permitted

提示不能删除1.txt

[www@localhost tmp]$ exit

[root@localhost tmp]# chmod -t test

去掉t权限。

[root@localhost tmp]# ls -ld test

drwxrwxrwx 2 root root 4096 Jun  2 18:13 test

[root@localhost tmp]# su www

[www@localhost tmp]$ rm -f test/1.txt

再次删除,则删除成功。

[www@localhost tmp]$ ls test/1.txt

ls: test/1.txt: No such file or directory




6. locate 命令报错 


docate /bin/ls

warning: locate: could not open database: /var/lib/slocate/slocate.db: No such file or directory

warning: You need to run the 'updatedb' command (as root) to create the database.

Please have a look at /etc/updatedb.conf to enable the daily cron job.



这是提示我们,系统目前没有创建slocate 数据库。

解决办法: 输入命令 updatedb 创建数据库

然后需  vim /etc/updatedb.conf  

让 DAILY_UPDATE=yes


7. find -name 查找多个文件 


find  / -name 1.txt -o -name 2.txt -o -name 3.txt ...


8. find 查找指定权限的文件



这就用到了 -perm 选项,具体用法是这样的:


1. -perm mode (比如: -perm 775)

解释:775 前面没有横线是代表只要找到百分之百一样的权限才算

好比说一个档案是 -rwxrwxr-x (775)就是100%的match

但是另一个档案是 -rwxrwxrwx (777)不是100%的match,others 多了写的权限就不是100%,所以不match!


2. -perm -mode (例如: -perm -775)

解释:-775 前面有横线表示只要标示的权限match,其他的无所谓,所以上面的第二个档案(777的)在这个case也会match的。


关于find命令中-perm中+- 的含义

举个例子:比如当前目录下有a b c d4个文件

a文件的权限为6000 也就是a文件仅有suid sgid的特殊权限

b文件的权限为2000 也就是b文件仅有sgid的特殊权限

c文件的权限为4000 也就是c文件仅有suid的特殊权限

d文件的权限为6600 也就是d文件有sgid suid的特殊权限并且该文件拥有者对该文件有读写权限

那么现在find . -type f -perm 6000 可以找到a文件,因为a文件权限为6000

那么现在find . -type f -perm -6000 可以找到a d两个文件,这是因为:

我们可以先将a b c d这4个文件的权限转化为2进制那么,

a权限转为2进制后为 110 000 000 000

b权限转为2进制后为 010 000 000 000

c权限转为2进制后为 100 000 000 000

d权限转为2进制后为 110 110 000 000

在 find   . -type f -perm -6000 中的6000权限转为2进制为110 000 000  000,那么6000前的-号代表缺一不可,也就是如果有1的地方必须有1,那么这里找-6000权限的文件,这6000权限里前面有2个位置都是1,所以这里find找-6000权限的文件就是找前面2个位置都是1的文件.而只有a d这两个文件前2个位置都是1,所以find . -type f -perm -6000 只会找到a d两个文件.


find . -type f -perm +6000会找到a b c d这4个文件,这是因为:

+6000 里的这个+号代表有1即可,也就是有1的位置,任何位置只要有1就可以.那么这里找+6000权限的文件,这6000权限前面2个位置都有1,所以这里find 找+6000权限的文件就是找前面2个位置只要有一个位置有1的文件就可以了,这4个文件都符合要求所以最后都能被 find . -type f -perm +6000找到


我们使用man查询find的帮助文档时,发现 -perm 还有一个  /modle 的格式,其实它等同于 +modle, 它建议我们使用 / 而不使用 +, 因为+ 容易产生混淆。所以以后您见到 find  -perm /modle 这样的格式时,就把它看成是+modle 即可。




你可能感兴趣的:(linux)