从发现到grep


8

我想做什么?

编写一个命令,查找我项目中任何其他文件都不需要的文件。

我尝试了什么?

find用来获取文件名列表。现在,我想使用文件名作为搜索字符串(而不是要搜索的文件)。

find server/lib -type f -exec basename {} \; | cut -f 1 -d '.'用来获取文件名列表并剥离文件扩展名。

现在,我知道这grep -R --exclude-dir=node_modules <search-string> . -l是我想将每个文件名传递到的内容,但是我不知道如何将它们作为<search-string>参数传递。


其他资讯

我也隐约地意识到,对此的管道grep传递可能会通过find(整个文件列表)如果我要这么做的话,我显然不想这样做,然后告诉我。

另外,(尽管这可能不在此问题的范围之内),因为我将其用作查找任何grep无法为其找到任何文件名的文件名的方法,对于获得这种输出的任何建议将不胜感激

> <the-command>

filename1
server/lib/foo.js # where these are the list of files in which it appears
test/lib/foo.js

filename2
Not Found! #where `filename2` wasn't found anywhere (obviously)

Answers:


2

简短答案:

如果您只是想将一堆线作为参数传递给另一个命令,那么xargs您就是您的朋友-在这种情况下,因为您将其放入命令的中间,所以需要使用该-I {}标志。这设置{}为占位符,以便您可以放置​​在任何位置(可以设置自己的占位符,但是我通常会坚持使用{}因为它不会被其他很多东西弄错。

将所有内容放在一起(假设您给出的命令按照您认为的去做!):

find server/lib -type f -exec basename {} \; | cut -f 1 -d '.' | xargs -I {} grep -R --exclude-dir=node_modules {} . -l

长答案

好的,所以我们可能可以更进一步。假设您想要前面提到的格式-可以这样做xargssh -c以便可以链接命令:

find server/lib -type f -exec basename {} \; | cut -f 1 -d '.' | xargs -I {} sh -c "echo {}; grep -R --exclude-dir=node_modules {} . -l"

我的机器上运行此,它看起来像这样是给你在文件中的文件发现。我的大脑很累,所以不必将其包装在一个不错的脚本中(当oneliners开始变得粗糙时,您应该实际使用它,并在使用时使用https://www.shellcheck.net/),您可以改用这种可怕的技巧,(我认为)这将为您提供所需的输出:

find server/lib -type f -exec basename {} \; | cut -f 1 -d '.' | xargs -I {} sh -c "echo {}; grep -R --exclude-dir=node_modules {} . -l && printf \"\n\" || printf \"Not found\n\n\""


非常感谢,是xargs -I {}我一直在寻找的东西。
西蒙·莱格

6

zsh

projects=(server/lib/**/*(D.:t:r))
grep -rFl --exclude-dir=node_modules -e${(u)^projects} .
  • **/递归遍历。zsh90年代初引入的功能。
  • (D.:t:r)是glob限定符,它是一种zsh特定于功能的功能,它允许使用名称以外的属性来选择文件,或者更改排序或对找到的文件进行修改。
  • D:包括点文件和遍历点目录find。最有可能的是,您希望将其取消。
  • .:仅常规文件(如-type f中的find
  • :t:r:历史记录修饰符,例如csh/中的修饰符,bash但此处适用于全局文件。:t代表尾部(基本名称),:r代表根名称(扩展名已删除)。
  • x${^array}像分配的元素rcx^$arrayfishx$array会做。例如,如果$array为(12)。那变成了x1 x2
  • ${(u)array}(对于unique),删除重复项((u)作为参数扩展标志)。

对于不包含任何字符串的文件列表,请替换-l-L(假设GNU grep,但是您已经在这里使用了GNU特定的选项)。-F用于固定字符串搜索(因为您可能不希望将这些项目名称视为正则表达式)。您可能还想抛出一个-w选项以grep进行单词匹配,例如,使其foo不匹配foobarfoo-bar尽管仍会匹配)。


非常感谢您的解释和解释,我不知道projects=(server/lib/**/*(D.:t:r))在zsh中产生像这样的数组。但是,我现在需要列出grep找不到任何内容的文件。我想我需要捕获一个0 / false退出代码?
西蒙·莱格

@Simon,看到部分大约-L在回答结束
斯特凡Chazelas

是的,我看到了。-l告诉我搜索结果在-L哪里,并告诉我找不到搜索结果的地方。但我想知道在任何地方都找不到而不是根本找不到的搜索词的列表
Simon Legg
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.