![为什么 grep -r --include=*.js * > dirname/.filename 不将所有 .js 文件写入单个文件?](https://linux22.com/image/1470169/%E4%B8%BA%E4%BB%80%E4%B9%88%20grep%20-r%20--include%3D*.js%20*%20%3E%20dirname%2F.filename%20%E4%B8%8D%E5%B0%86%E6%89%80%E6%9C%89%20.js%20%E6%96%87%E4%BB%B6%E5%86%99%E5%85%A5%E5%8D%95%E4%B8%AA%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我正在尝试将目录和子目录中的所有 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