启用通配符以递归方式运行

时间:2018-05-31 11:10:17

标签: bash

我想对来自当前目录及其子目录的所有txt文件中的单词进行统计。

In [39]: ls
about.txt            distutils/           installing/          whatsnew/
bugs.txt             extending/           library/             word.txt
c-api/               faq/                 license.txt          words_frequency.txt
contents.txt         glossary.txt         reference/
copyright.txt        howto/               tutorial/
distributing/        install/             using

我首先尝试了命令:

 In [46]: !grep -Eoh '[a-zA-Z]+' *.txt | nl

有一个问题是找不到子目录中的文件:

 In [45]: !echo *.txt
 about.txt bugs.txt contents.txt copyright.txt glossary.txt license.txt word.txt words_frequency.txt

我将其改进为:

In [48]: ! echo */*.txt | grep "about.txt"
In [49]:

再次出现问题,无法找到一级目录的文件,无法遍历随机长度的文件。

有趣的是,python对这个问题有一个解决方案:

In [50]: files = glob.glob("**/*.txt", recursive=True)
In [54]: files.index('about.txt')
Out[54]: 4

它可以递归遍历dirs以查找所有txt个文件。

然而,python移动文件并将文本数据更改为grep "pattern" *.txt

是很麻烦的

如何将通配符设置为贪婪的递归行为。

作为替代方案,find命令有帮助

find . -regex -E ".*\.txt" -print0 -exec grep -Eoh "{}" "[a-zA-Z]+" | nl \;

如果可能的话,这不像贪婪的通配符那么方便。

无法在Macos上激活globstar

$ shopt -s globstar
-bash: shopt: globstar: invalid shell option name
$ bash --version
GNU bash, version 4.4.19(1)-release (x86_64-apple-darwin17.3.0)

1 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,你可以使用这样的东西:

find -type f -name '*.txt' -exec /bin/grep -hEo '\w+' {} \; \
  | sort \
  | uniq -c \
  | sort -k1,1n