shell编程之如何遍历进入当前目录下的所有子目录(转)
问题:
我想在顶层目录下编写一个脚本来调用自录下的clean.sh文件,该如何实现?
?
第一种情况:
假设目录结构为:
fme/
?? ? |__clean.sh?
?? ? |__dc250/clean.sh
?? ? |__dc300/clean.sh
?? ? |__dc350/clean.sh
现在我在fme结构下编写一个clean.sh文件调用各个子目录下的clean.sh文件。
实现方法如下:
?#!/bin/bash
?for?dir?in?`ls?.`?
这里需要学习的是if的判断语句。
文件表达式if [ -f ?file ] ? ?如果文件存在if [ -d ... ? ] ? ?如果目录存在if [ -s file ?] ? ?如果文件存在且非空?if [ -r file ?] ? ?如果文件存在且可读if [ -w file ?] ? ?如果文件存在且可写if [ -x file ?] ? ?如果文件存在且可执行?
?
整数变量表达式if [ int1 -eq int2 ] ? ?如果int1等于int2 ??if [ int1 -ne int2 ] ? ?如果不等于 ? ?if [ int1 -ge int2 ] ? ? ? 如果>=if [ int1 -gt int2 ] ? ? ? 如果>if [ int1 -le int2 ] ? ? ? 如果<=if [ int1 -lt int2 ] ? ? ? 如果<?
?
字符串变量表达式If ?[ $a = $b ] ? ? ? ? ? ? ? ? 如果string1等于string2?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?字符串允许使用赋值号做等号if ?[ $string1 != ?$string2 ] ? 如果string1不等于string2 ? ? ??if ?[ -n $string ?] ? ? ? ? ? ? 如果string 非空(非0),返回0(true) ?if ?[ -z $string ?] ? ? ? ? ? ? 如果string 为空if ?[ $sting ] ? ? ? ? ? ? ? ? ?如果string 非空,返回0 (和-n类似)??
此问题就这样解决了。
?
还学习到了一个遍历所有子目录的表达方式:
find . -type d | while read dir; do echo $dir; done
?
第二种情况:
第一种情况是两层次的目录是父子关系,因此可以上面的方法实现。若两个层次上的目录并不是直接的父子关系,这时候在用上面的方法显然不合适。这里采用更加简洁的方法,第一种情况亦可以用。
#!/bin/bashdone
?
学习点:
搜索某个文件:
find . -name clean.sh
提取出路径名
dirname path
字符串判断
if [ $path != . ] ; 原来点就可以直接作为字符串