LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: budgerigar

shell中有链表吗?

[复制链接]
发表于 2007-7-2 08:29:15 | 显示全部楼层
grep -r -l  字符串  目录

将会递归查找某个目录下的所有文件,如果包含指定的字符串就打印出文件名

-r 表示递归查找
-l 只打印文件名,而且只查找一个结果,即如果发现了字符串,就不再查找该文件了(这样速度能很快)

如果想忽略大小写,那么可以再添加一个  -i  参数

[color="Red"]一直没有在意grep的一些特殊参数,所以上面给出了一个用find的列子,显得是画蛇添足了
回复 支持 反对

使用道具 举报

发表于 2007-7-2 09:13:36 | 显示全部楼层
Post by Jockey
递归本来不就是以性能换取代码的简洁么?
不过我好奇的是你有什么更好的办法呢?当然,除了 find(1) 以外。

试试这个
  1. #! /bin/bash
  2. # set -e
  3. rec() {
  4.     local a=$1
  5.     if [ ! -d "$a" ]; then
  6.         echo "File: $(pwd)/$a"
  7.         return
  8.     else
  9.         cd "$a";
  10.         echo "Dir: `pwd`"
  11.         local b
  12.         for b in $( ls -1 ); do
  13.             rec "$b";
  14.         done
  15.         cd ..
  16.     fi
  17. }
  18. ## main ##
  19. if [ $1 ]; then
  20.     rec $1
  21. else
  22.     rec `pwd`
  23. fi
复制代码
请参考http://linuxsir.cn/bbs/showthread.php?t=295673
回复 支持 反对

使用道具 举报

发表于 2007-7-2 09:45:50 | 显示全部楼层
我刚刚明白你的意思...-_-
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-2 10:31:07 | 显示全部楼层
Post by huan
试试这个

  1. #! /bin/bash

  2. # set -e

  3. rec() {
  4.     local a=$1
  5.     if [ ! -d "$a" ]; then
  6.         echo "File: $(pwd)/$a"
  7.         return
  8.     else
  9.         cd "$a";
  10.         echo "Dir: `pwd`"
  11.         local b
  12.         for b in $( ls -1 ); do
  13.             rec "$b";
  14.         done
  15.         cd ..
  16.     fi
  17. }

  18. ## main ##

  19. if [ $1 ]; then
  20.     rec $1
  21. else
  22.     rec `pwd`
  23. fi

复制代码

请参考http://linuxsir.cn/bbs/showthread.php?t=295673

我试了这个了,确实不错但有一点不明白,local怎么用,google了但没查到
还有一点,Jockey的改成这样就和上面的一样吧

  1. sample() {
  2.         for i in *; do
  3.                 if [ -d "$i" -a -x "$i" ]; then
  4.                         cd "$i" && sample
  5.                         cd ..
  6.                 else
  7.                         processing normal file "$i"
  8.                 fi
  9.         done
  10. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-7-2 10:36:13 | 显示全部楼层
bash里的变量默认是全局的
递归时如果不用local定义的话
变量赋值时被把前边的值覆盖了

local一般在函数中使用
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-2 12:30:28 | 显示全部楼层
Post by huan
bash里的变量默认是全局的
递归时如果不用local定义的话
变量赋值时被把前边的值覆盖了

local一般在函数中使用

哦,我明白了,谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表