在一个备份脚步中执行了删除7天前的旧备份文件的命令,备份文件存放在/home/backups/files/下,命令如下:
find /home/backups/files/ -mtime +6 -exec rm -rf {} \;
开始时候运行正常,一段时间后发现没有备份了,查看下来,发现/home/backups/files/文件都不存在了。原来是因为find写法有问题,find /home/backups/files/ -mtime +6 出来的结果会包含/home/backups/files/目录(当files目录的创建时间超过7天),是自己想当然的以为在目录后面加了“/”就只查找该目录下的文件,测试下来,find /home/backups/files/ -mtime +6和find /home/backups/files -mtime +6的结果一致。知道问题所在了,解决问题就好办了,只需要在后面加个星号(*)通配符就行了,如下:
find /home/backups/files/* -mtime +6 -exec rm -rf {} \;
linux下通过rm命令来删除文件,但是如果要删除文件名乱码的文件,就不能直接使用rm命令了,因为压根就无法输出文件名来。不过借助find命令可以实现对其删除。在linux下对于每个文件都一个对应的不变的inode号,使用 ls -li 可以查看到文件的inode号,同时find可以根据inode号来查找,另外find命令中可以执行其他的命令。删除的步骤如下:
- 通过ls -li 获取要删除乱码文件名文件的inode号,比如得到的是 123456
- 执行删除
find ./ -inum 123456 -exec rm -rf {} \;
注意:“{}”后要空一格再加上“\;”。
在某些版本的linux下,通过find查找当前目录下所有后缀名jpg的文件,命令为
find ./ -iname *.jpg
会出现“find: 路径必须在表达式之前”的错误提示。解决的方法有两种
- 使用转义符把*转义,即 \*.jpg
- 用引号引起来 ,即 “*.jpg”
注意:如果需要把find 的结果提交给while,例如:
`echo find ./ -iname "\*.jpg"` | while read f
do
#do something
done
则既需要转义符,也需要引号
find 命令有几个用于根据您系统的时间戳搜索文件的选项。这些时间戳包括
mtime 文件内容上次修改时间
atime 文件被读取或访问的时间
ctime 文件状态变化时间
mtime 和 atime 的含义都是很容易理解的,而 ctime 则需要更多的解释。由于 inode 维护着每个文件上的元数据,因此,如果与文件有关的元数据发生变化,则 inode 数据也将变化。这可能是由一系列操作引起的,包括创建到文件的符号链接、更改文件权限或移动了文件等。由于在这些情况下,文件内容不会被读取或修改,因此 mtime 和 atime 不会改变,但 ctime 将发生变化。
这些时间选项都需要与一个值 n 结合使用,指定为 -n、n 或 +n。
N * 24
+1 表示 1 * 24 +24小时以外..
+0 表示 0 * 24 +24小时以外
1 表示 1 * 24 + 24 到 24 之间..
0 表示 0 * 24 + 24 到 0 之间..
-1 表示 0 * 24 +24 内,甚至为未来时间...
1.当前时间24小时—当前时间(昨天-今天)
#find . -mtime 0
2.当前时间48小时前–当前时间24小时前(前天-昨天)
#find . -mtime 1
3.当前时间48小时前(2天前)
#find . -mtime +1
4.当前时间24小时–当前时间(昨天-今天)
#find . -mtime -1