学前理论
isfile(),isdir(), islink(), isabs():分别用来测试所传入的路径字符串是否为档案、目录、符号连结或绝对路径。这个脚本在命令行执行是ok的,但刚在crontab中发现是执行不成功的linux常用命令,后来通过一系列验证,发现原来是路径的问题,crontab中当然是要用绝对路径的,所以,crontab中要执行的脚本也必然要使用绝对路径,原来我们的运行脚本中有一个java类使用的是相对路径,所以导致脚本没有执行,但日志文件却创建了,所以很快可以定位是脚本执行没有成功,把路径修改成绝对路径,发现执行后,java类把路径当作包名来识别,所以最后就只能在shell脚本前面加上目录切换命令,如cd /root/...的,这样脚本执行就都可以识别到目录了,而且不管在哪儿执行,它都是绝对的路径,可以找到并运行成功。而 ms dos 1.0 继承了 cp/m 的这个特性,所以,当 ms dos 2.0 引入「目录」的概念以后,为了兼容 1.0 也在路径钱保留了「盘符」字符,而斜杠「/」符号是原来 vms 和 cp/m 系统中表示「命令参数开始」的符号,所以后来的 dos 以及 windows 必须区分,而采用了 反斜杠「\」 符号作为路径分隔符。
?locate:原理是updatedb会把文件系统中的信息存放到数据库databases中(但一般一天才执行一次,所以locate找不到新创建的文件,需要先手动执行updatedb,再执行locate),locate从数据库中读数据;
? find:在目录结构中搜索文件,并执行指定的操作
语法:find pathname -options [-print -exec ...]
道理很简单, 你想在任何时候都使用%java_home%\bin\java 等来执行java命令吗, 当然不会, 于是, 你可以选择把 %java_home%\bin添加到path路径下, 这样, 我们在任何路径下就可以仅用java来执行命令了.(当你在命令提示符窗口输入你个代码时,操作系统会在当前目录和path变量目录里查找相应的应用程序, 并且执行.。第一个搜索的路径是binary所在的路径,如果不在binary所在的路径,则查找binary中hardcode记录的build目录,例如obj\debug\*.pdb, 如果以上两个路径都没有找到pdb,则根据symbol server的设置,在本地的symbol server的cache中查找,如果在本地的symbol server的cache中没有对应的pdb,则最后才到远程的symbol server中查找。-prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。这里需要注意一个叫“run-parts”的参数,如果加上这个参数,代表执行文件夹中的命令,而不是执行脚本或者命令,如果不加则代表执行命令或者脚本。find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个sam用户。
-print: find命令将匹配的文件输出到标准输出;
? 单纯tar仅为打包(多个文件包成一个大文件),加上参数-j(bzip2格式.bz2)、-z(gzip格式.gz)可以备份、压缩(-c)、解压(-x),备份一般比压缩多加参数-p(保留原本文件的权限与属性),-C可以指定解压到特定目录;bzip2、gzip只能对单一文件压缩;