shellfor遍历目录
㈠ 如何用shell遍历一个目录下的所有子目录
SAVEIFS="$IFS"
IFS="
"
hypen="------------------------------------------------------------------------------------"
printhypen()
(
tab=$(($1*4))
if[$tab-gt0]
then
printf"%-.${tab}s""$hypen"
fi
)
traverdir()
(
pushd"$1">/dev/null2>&1
tab="$2"
forfilein`ls-1`
do
iftest-d"$file"
then
printhypen$tab
echo"<dir>$file"
traverdir"$file""$((tab+1))"
else
printhypen$tab
echo"$file"
fi
done
popd>/dev/null2>&1
)
read-p"请输入要遍历的目录:"dir
traverdir"$dir"0
IFS="$SAVEIFS"
㈡ linux shell 命令怎么遍历目录
先设定实验环境:
# 造 5 个 目录,每个目录下,造 3 个 文件和两个子目录如下:
cd $HOME/tmp
for i in d1 d2 d3 d4 d5
do
mkdir -p $i
touch $i/1.txt $i/2.txt $i/3.txt
mkdir -p $i/tmp1 $i/tmp2
done
# 检验测试环境:
$ ls -lR d1
total 0
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 1.txt
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 2.txt
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 3.txt
drwxr-sr-x 2 wenlee comm 256 Dec 22 10:35 tmp1/
drwxr-sr-x 2 wenlee comm 256 Dec 22 10:35 tmp2/
# 利用下列脚本来实现你要做的:
cd $HOME/tmp
for i in */1.txt
do
echo "Found $i, save $i and remove everything else under $(dirname $i)/"
save_this_file=$(basename $i)
curr_dir=$(dirname $i)
# 把这个1.txt暂时存到/tmp里面去,为了避免已经有同样的档案名称在/tmp,加上$$ (i.e. PID)
mv $i /tmp/${save_this_file}.$$
rm -rf $curr_dir
mkdir -p $curr_dir
mv /tmp/${save_this_file}.$$ $curr_dir
done
# 屏幕执行输出如下:
Found d1/1.txt, save d1/1.txt and remove everything else under d1/
Found d2/1.txt, save d2/1.txt and remove everything else under d2/
Found d3/1.txt, save d3/1.txt and remove everything else under d3/
Found d4/1.txt, save d4/1.txt and remove everything else under d4/
Found d5/1.txt, save d5/1.txt and remove everything else under d5/
# 复验实验环境:
$ ls -l d?/*
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 d1/1.txt
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 d2/1.txt
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 d3/1.txt
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 d4/1.txt
-rw-r--r-- 1 wenlee comm 0 Dec 22 10:35 d5/1.txt
OK?
thanks!
㈢ 用shell层级遍历dir目录,统计文件总数量、总大小,并按扩展名分类统计各种文件的数目、总大小。
#!/bin/bash
functiondirectory(){
forfilein$(ls$1)
do
basepath="$1/$file"
if[-d"$basepath"];then
echo"|-directory:$file"$(-h$basepath|cut-f1)
directory$basepath
elif[-f"$basepath"];then
echo"|--file:$file"$(-h$basepath|cut-f1)
fi
done
}
directory$1
调用方法:./testfind.sh你要遍历的路径
我只是简单的写了一个,大致功能的思想如此,你也可以在此基础上进行扩展,不过好像应该有
现成的,你网上搜一搜吧。。
㈣ 我用shell编写的遍历当前目录及所有子目录找mac.c这个文件,有问题希望大家帮忙看一下
elif["$file"="mac.c"]
这句判断表达式里少了一个空格。
应为:
elif["$file"="mac.c"]
㈤ shell 遍历目录,提取所有特定文件U,复制出来并重命名
@echooff
for/f"delims="%%ain('dir/ad/b')do(
pushd%%a
for/f"delims="%%bin('dir/a-d/b/sU')do(
"%%b""另一个文件夹\%%a_%%b"
)
popd
)
保存为.bat文件,放在C:UsersA下执行
㈥ linux shell中的遍历目录并删除目录下与目录名相同的文件
;do
if[-d/$i/$i];then
rm-rf/$i/$i
fi
done
代码如上,但如楼上所说,!慎用 !
㈦ shell 循环遍历目录问题
当while读取管道输出的结果时,肯定会出现这样的问题。
因为使用for,while,until,if,case这些命令时用到了管道,那么bash会产生一个子shell来运行它们。可以想象count在循环体中能够正确的计数,一旦while执行完毕,子shell完成,其内部的变量count就消失了。因而得到的结果是循环体外echo永远是0!
之前也遇到过这样的问题,网上找的一些解决方法不是太理解,我就用了一个比较笨的办法:
先将ls /var/tmp/tomcat-logs -1的结果写到文件,再用while来读文件来计数,用完后再将临时文件删除即可。
ls /var/tmp/tomcat-logs -1 >/tmp/test.txt
while read fn; do
echo $count
customer[$count]=$fn
echo ${customer[$count]}
count=$[$count+1]
done </tmp/test.txt
echo $count
rm /tmp/test.txt
㈧ 在windows中用shell遍历一个文件夹下得所有文件并对文件执行同一个指令
你的for循环中循环的是$PATH ,他只是代表这个路径,并不表示里面的文件名。
㈨ shell 遍历目录中所有文件 改名
#!/bin/bash
base_dir=$(dirname$0)
fordirin$(ls$base_dir);do
current_dir="$base_dir/$dir"
if[!-d$current_dir];then
continue
fi
forold_file_namein$(ls$current_dir);do
old_file="$current_dir/$old_file_name"
if[!-f$old_file];then
continue
fi
new_file_name="$current_dir/${old_file_name}_${dir}"
mv$old_file$new_file_name
done
done
改名的部分帮你写了,放到把脚本放到你说的有好多目录的那个目录里执行就可以了
数据库的部分自己想吧
㈩ shell怎么遍历一个文件夹下所有文件
# find . -type f
./a
./normal/log-1
./normal/log-2
./normal/log-3
通过find找到文件
那么遍历就用循环
for i in `find . -type f`
do
echo $i
done