我正在尝试使用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或某种类型的后续命令或脚本,就无法做到这一点。谢谢大家的帮助。
答案 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模式更强大。