我正在尝试将目录和子目录中的所有 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