您的位置:首页 > 运维架构 > Linux

必 备 习 题 集 ( 六 )

2015-10-05 22:09 477 查看
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