我想仅.git/
使用命令列出除目录内的所有文件之外的所有文件find
。
我试过这个:
$ find . -path .git -prune -type f
$
它返回了 0 个文件(而不是我拥有的 2 个文件)所以我尝试了这个:
$ find . -not -path .git -type f | grep -c '\.git'
1770
$
我不明白为什么这些都不起作用,你能帮忙吗?
EDIT0:感谢@icarus,我看到路径必须在前面,./
因此我错过了OR
运算符,这个命令有效:
$ find . -path ./.git -prune -o -type f | grep '\.git'
./.git
./.gitignore
$
EDIT1: 为什么其他命令不起作用?
$ find . -not -path ./.git -a -type f | grep -c '\.git'
1770
$
EDIT2:最后一个问题:为什么-prune
谓词不需要在下面的命令中-o -print
打印./.git
和结果:./.gitignore
$ find . -name ".git*" -prune | grep git
./.git
./.gitignore
$ find . -name ".git*" -prune -o -print | grep -c git
0
EDIT3:谢谢@rastafile:
$ find . -name ".git*" -prune | grep git
./.git
./.gitignore
$ find . -name ".git*" -prune -print | grep git
./.git
./.gitignore
$ find . -name ".git*" -prune -o -print | grep git
$
当前面的表达式为 true 时,GNU 似乎隐式地查找-prune
谓词调用:-print
如果表达式不包含除 -prune 之外的任何操作,则对表达式为真的所有文件执行 -print。
总之:我需要的命令是:
$ find . -name ".git*" -prune -o -type f -print
谢谢大家。
在 find 中加入术语的默认操作是
and
这样表示查找既属于 root 又称为 fred 的文件。你想做一个
or
操作,如果它叫做“.git”然后修剪它或者如果它是一个文件然后列出它。注意我使用的是
-name
而不是-path
. 如果你给它一个起始位置,.
那么.git
顶层目录将被调用./.git
以用于-path
.所以
-path .git
什么都不提供,因为所有文件都开始时没有匹配项./
为您提供每个文件,因为所有内容都匹配
-not -path .git
,因此唯一的过滤是-type f
将输出限制为文件。-path
和之间有很大的不同-name
——它们根本不相似:“名称”只看最后一部分,“路径”看整个斜杠链。“文件名”应该是什么意思,或者“路径名”,总是有点争议。但这里很清楚也很重要。这有效(你说):
您从 开始
.
,因此会找到并修剪默认的 gitdir。不./.git
存在其他人,因此检查其他所有人 (-o
) 的类型文件。你的最后一个例子:
不起作用,它只会找到所有文件。
如果你想避免
-prune
,你必须匹配里面的每个条目:我同意 Icarus 的 -name/-prune 组合,但我有一个修改:
这里不需要括号。
即使
-name '*git*'
添加,用于测试/减少输出。最后的显式操作
-print
通过 prune 抑制打印:我不确定括号;我查了一下
man find
(GNU),发现了关于它们的很好的细节:对我来说,更清楚的是:
但是这样是行不通的!
如果你在
-a
这里省略了类似的东西,那么-o
就足够突出了,所以可以省略括号,也是为了清楚起见。(因为 shell 也喜欢括号,所以你必须引用它们。但是再见了。)
不带引号的
!
可以工作(我的可以),不带引号的*
不行。因此,要查找除任何目录之外的文件(所有类型)
.git
:(类型 -d 也可以省略,如果您不在乎...请参阅 Kamil 的评论...那里是一片丛林,而 find 是一种小型编程语言:您需要什么)