尝试使用unix命令'find'查找已签入RCS的所有文件

时间:2013-03-31 01:14:25

标签: unix find rcs

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

等命令时
find . -name \*v 
find . -name \*c,v 

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

的文件
./LABTECH/RCSlab/trig/RCS/main.c,v

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

在某种程度上,我可以从我的主目录开始获取一个find命令来返回RCS目录中的所有文件。我知道我之后可以过滤掉不需要的文件,但它只需要向我展示RCS目录中的文件。

在阅读完所有答案之后,我决定假设,v是RCS文件是最好的解决方法,因为我们没有为老师提供脚本来问我们这样的问题。我们不应该为xargs或grep管道问题,并且-path对我的unix版本不起作用。从perreal中知道使用-name不允许我匹配'/',这有助于我清除其他一些我没有问过的问题。我已经明白,如果没有-path或某种类型的后续命令或脚本,就无法做到这一点。谢谢大家的帮助。

4 个答案:

答案 0 :(得分:1)

尝试这样做:

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

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

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

答案 1 :(得分:0)

来自find man-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'

答案 2 :(得分:0)

您应该假设如果文件名结束,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 :(得分:0)

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模式更强大。