目录的递归列表

时间:2010-11-08 04:03:00

标签: unix shell recursion clearcase

我有以下代码,必须对所有文件和目录进行递归列表。 我不确定它是否正常工作。

#!/usr/bin/sh
recur_fun()
{
    for i in `ls -ltr | awk '{print $9}'` 
    do
        echo $i;
        cd $i;
        ls
        pwd
        recur_fun
        cd ..
        pwd
    done
} 

recur_fun

我需要复制文件的名称,然后以明文形式使用它。

4 个答案:

答案 0 :(得分:5)

我建议将其替换为:

find . -print

答案 1 :(得分:2)

ls已经有一个递归选项:

ls -R

答案 2 :(得分:2)

注意:我建议使用cleartool命令而不是特定于操作系统的shell命令。

例如:

cleartool ls -r -nxn

list all files递归,私有或不私有。
有关详情,请参阅Command line to delete all ClearCase view-private files

答案 3 :(得分:1)

如果目的是完成工作,那么使用预先构建的工具(例如“find”或“ls -R”来可靠地完成工作。

假设目的是了解递归和shell脚本,而不是完成工作,那么由于多种原因它无法正常工作:

  1. 它不会处理带有空格的名称。
  2. 当某些内容不是目录时,cd最多会产生错误消息。
  3. 最糟糕的是,如果设置了CDPATH并且可以在CDPATH上找到名称,那么脚本就会变得混乱。
  4. 因为您没有检查cd是否有效,所以您很容易看到相同的文件一遍又一遍地重复出现(在给定目录中每个文件一次)。
  5. 此外,这两个分号是多余的。

    如果您确实需要在脚本中使用cd,那么在子shell中执行此操作通常是个好主意:

    if [ -d $i ]
    then ( cd $; pwd; recur_fun )
    fi
    

    当子shell完成时,您知道父级仍处于以前完全相同的位置 - 它不依赖于cd命令跨符号链接执行的变幻莫测。现代贝壳(意为bash)似乎认为你通常应该想要一个'逻辑cd'操作,这会让我感到害怕,因为我几乎从不想要这种行为。