【问题标题】:Trying to use the unix command 'find' to find all files checked into RCS尝试使用 unix 命令“查找”查找所有签入 RCS 的文件
【发布时间】:2013-03-21 10:59:15
【问题描述】:

我正在尝试使用 find 命令从我的主目录中查找所有签入 RCS 的文件。这包括以c,v 之类的文件结尾的文件。当我运行诸如

之类的命令时
find . -name \*v 
find . -name \*c,v 

这与我想要的方式很接近,并且会给我看起来像的文件

./LABTECH/RCSlab/trig/RCS/main.c,v

这很好,除非我出于某种原因在我的计算机上有一个以 v 或 c,v 结尾但不在 RCS 中的随机文件,它也会返回该文件。像find . -name \*RCS\*c,v 这样的东西不起作用并且什么也不返回。 find . -name RCS\* 将返回 RCS 目录,但不会返回 RCS 目录中的任何文件。

有没有办法让我从我的主目录开始获得一个 find 命令来返回 RCS 目录中的所有文件。我知道我可以在之后过滤掉不需要的文件,但它只需要显示 RCS 目录中的文件即可。

在阅读了所有答案后,我决定假设 ,v 是 RCS 文件是解决此问题的最佳方法,因为我们还没有为我的老师编写脚本来问我们这样的问题。我们也不应该通过管道输入 xargs 或 grep 来解决这个问题,并且 -path 在我的 unix 版本上不起作用。从 perreal 知道使用 -name 不允许我匹配 '/' 这有助于清除我有但没有问的其他一些问题。我已经了解到,如果没有 -path 或某种类型的以下命令或脚本,就无法做到这一点。谢谢大家的帮助。

【问题讨论】:

    标签: unix find rcs


    【解决方案1】:

    尝试这样做:

    find . -path '*/RCS/*,v'
    

    如果您的find 版本缺少-path 选项,您可以测试:

    find . -name '*,v' -print | grep -E 'RCS/[^/]+,v$'
    

    【讨论】:

    • 通常情况下,RCS 目录紧接在文件名之前,因此您可以编写 -path '*/RCS/*,v' 来标识 RCS 文件。
    【解决方案2】:

    您应该假设如果文件名以,v 结尾,则它是一个RCS 文件。任何不存在的闯入者都应该很少。

    find $HOME -name '*,v'
    

    如果您对使用 RCS 子目录保持一致,那么您可以使用 POSIX find 选项 -path 来跟踪 RCS 子目录中的文件:

    find $HOME -path '*/RCS/*,v'
    

    如果您必须识别实际的 RCS 文件,那么您需要运行一些程序(脚本)来验证这些文件是否真的是 RCS 文件:

    find $HOME -name '*,v' -exec rcsfiles {} +
    

    其中rcsfiles 是一个假设的脚本,它与给出的参数名称相呼应,这些参数实际上是 RCS 文件。我会使用rlog 命令来识别文件是否是RCS 文件。 rcs 命令没有将验证 RCS 文件的无操作操作。 rcsfiles 脚本可能很简单:

    for file in "$@"
    do
         if rlog "$file" >/dev/null 2>&1
         then echo "$file"
         fi
    done
    

    【讨论】:

      【解决方案3】:

      来自findman-page

      -name pattern
             Because the leading directories are removed, the file names
             considered for a match with -name will never include a slash, 
             so `-name a/b' will never match anything (you probably need 
             to  use -path instead). 
      

      所以你可以使用-path 而不是-name,就像 sputnick 的回答一样。另一种方法是先找到相关目录:

      find -name '*RCS' -type d | xargs -n1 -I{} find {} -name '*.c,v'
      

      【讨论】:

        【解决方案4】:
        find . -type f -name '*,v' | grep /RCS/
        

        这将查找名称以,v 结尾且位于名为RCS 的目录下的所有文件。

        如果您想确保它们立即RCS 目录下:

        find . -type f -name '*,v' | grep '/RCS/[^/]*$'
        

        这可确保/RCS/ 之后没有额外的/ 字符。

        请注意,CVS 也使用,v 后缀(和相同的文件格式),并且不为其存储库文件使用特殊的目录名;它使用CVS 目录,但它是在您签出文件时创建的,并且只包含少量元数据文件。如果您没有在系统上使用 CVS,那可能不会成为问题。如果你同时使用 RCS 和 CVS,上面应该只找到 RCS 维护的 ,v 文件,忽略 CVS 维护的那些。

        使用find -path 的其他答案可能更好,但这是另一种选择——出于其他目的,grep 正则表达式比find -path 接受的shell 模式更强大。

        【讨论】:

          猜你喜欢
          • 2016-05-18
          • 1970-01-01
          • 1970-01-01
          • 2011-12-16
          • 2015-06-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多