1

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

find . -name \*v 
find . -name \*c,v 

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

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

这很好,除非我出于某种原因在我的计算机上有一个以 av 或 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 或某种类型的以下命令或脚本,就无法做到这一点。感谢大家的帮助。

4

4 回答 4

1

尝试这样做:

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

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

find . -name '*,v' -print | grep -E 'RCS/[^/]+,v$'
于 2013-03-31T01:24:50.893 回答
0

find 手册页

-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). 

因此,您可以在 sputnick 的回答中使用-path而不是使用。-name另一种方法是首先找到相关目录:

find -name '*RCS' -type d | xargs -n1 -I{} find {} -name '*.c,v'
于 2013-03-31T01:26:00.880 回答
0

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

find $HOME -name '*,v'

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

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

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

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

where rcsfiles is a hypothetical script that echos the names of the arguments it is given that actually are RCS files. I would use the rlog command to identify whether the file is an RCS file or not. The rcs command doesn't have a no-op operation that will validate an RCS file. The rcsfiles script might well be as simple as:

for file in "$@"
do
     if rlog "$file" >/dev/null 2>&1
     then echo "$file"
     fi
done
于 2013-03-31T01:44:57.800 回答
0
find . -type f -name '*,v' | grep /RCS/

This will find all files whose names end in ,v that are under a directory named RCS.

If you want to be sure they're immediately under an RCS directory:

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

This ensures that there are no additional / characters after the /RCS/.

Note that CVS also uses the ,v suffix (and the same file format) and does not use a special directory name for its repository files; it uses a CVS directory, but that's created when you checkout files, and it only contains a handful of metadata files. If you're not using CVS on your system, that probably won't be an issue. If you're using both RCS and CVS, the above should find only ,v files maintained by RCS, ignoring those maintained by CVS.

The other answers using find -path are probably better, but this is an alternative -- and for other purposes, grep regular expressions are more powerful than the shell patterns accepted by find -path.

于 2014-07-26T00:51:34.973 回答