为什么 grep -r --include=*.js * > dirname/.filename 不将所有 .js 文件写入单个文件?

为什么 grep -r --include=*.js * > dirname/.filename 不将所有 .js 文件写入单个文件?

我正在尝试将目录和子目录中的所有 js 文件按词汇顺序放入单个文件中。我做错了什么?

答案1

grep是错误的工具,部分原因是它只会从那些与你给出的模式匹配的文件中发出行(并且大概是你想要的全部行),部分原因是你没有给出模式,所以它使用第一个文件名作为模式(即不是很有帮助。

列出所有*.js文件非常简单:

find . -name '*.js'

将它们连接成一个文件也很容易:

find . -name '*.js' | xargs cat

但是,仅根据文件名的词汇顺序对它们进行排序,而不管它们位于哪个目录中,则比较困难。

只是简单地sort这样做是行不通的,并且--key当字段数量未知时,没有选项可以选择最后一个字段。

下面使用 sed 将文件名移动到行首,对其进行排序,然后再次将其删除。

find . -name '*.js' | sed 's:^.*/\([^/]*\)$:\1 \0:' | sort | cut -d' ' -f2-

如果任何文件或目录名称中有空格,则此操作将无法正常工作。

然后您可以通过添加以下内容来提取内容cat

find . -name '*.js' \
      | sed 's:^.*/\([^/]*\)$:\1 \0:' | sort | cut -d' ' -f2- \
      | xargs cat

相关内容