我想搜索目录结构以计算加载各种R软件包的次数。源包含在.org和.R文件中。我愿意假设“ library(”是我关心的任何行上的第一个非空白条目,并且我愿意假设每行最多只有一个这样的调用。
find . -regex ".*/.*\.org" -print
获取我的.org文件列表,然后
find . -regex ".*\.\(org\|R\)$" -print
为我提供了.org和.R文件的列表(由于[C0])。
给出一个特定的文件,
https://unix.stackexchange.com/questions/15308/how-to-use-find-command-to-search-for-multiple-extensions
获取包装名称。我想将它们连接在一起,然后可能将输出重定向到一个文件,我可以从中使用R来计算频率。
貌似简单
grep -h "library(" file | sed 's/library(//' | sed 's/)//'
无效;我得到
find . -regex ".*/.*\.org" -print | xargs -0 grep -h "library(" | sed 's/library(//' | sed 's/)//'
而且我不确定下一步该怎么做。
我也尝试过
find . -regex ".*/.*\.org" -print | xargs -0 grep -h "library(" | sed 's/library(//' | sed 's/)//'
Usage: /usr/bin/grep [OPTION]... PATTERN [FILE]...
Try '/usr/bin/grep --help' for more information.
并且得到
find . -regex ".*/.*\.org" -exec grep -h "library(" "{}" "\;"
似乎很简单。我想念什么?
更新:在上面的xargs中添加-t将向我显示第一个命令:
find . -regex ".*/.*\.org" -exec grep -h "library(" "{}" "\;"
find: missing argument to `-exec'
大概后面是所有具有相对于PWD的路径的匹配文件的列表。实际上,如果我仅搜索.org文件,则该方法有效;如果我也添加.R文件,则会得到“ xargs:参数行太长”。我认为这意味着xargs将整个文件列表作为参数传递给grep的一次调用。
grep -h library ./dirname/filename.org
OK
find ... -print | xargs
OK
find ... -print0 | xargs -0
损坏
[find ... -print0 | xargs
损坏(用过的地方)]
也请不要:
find ... -print | xargs -0
更快时:
grep -h "library(" | sed 's/library(//' | sed 's/)//'
这甚至更快,而且更有趣:
grep -h "library(" | sed -e 's/library(//' -e 's/)//'