我正在尝试将.js
目录和子目录中的所有文件按词汇顺序放入单个文件中。我尝试过:
grep -r --include=*.js * > dir/.filename
我做错了什么?
答案1
您可以使用find
来查找文件,然后sort
对名称进行排序:
find . -type f -name '*.js' | sort
要将名称保存在文件中:
find . -type f -name '*.js' | sort >files.txt
让我们分析一下你的命令:
grep -r --include=*.js *
您需要在使用
-r
选项 eg 时将目录名称作为参数(也请放在''
glob 匹配周围,以免产生意外结果):grep -r --include='*.js' .
这将寻找非空文件,即这相当于:
grep -r --include='*.js' '.' .
如果你想检查特定的模式,例如以以下内容开头的行
TERM
:grep -r --include='*.js' '^TERM' .
无论如何,重点是grep
在文件内容中搜索任何匹配项,但您的目标是匹配文件名,因此您应该寻找可以执行此操作的其他方法,例如find
shell 循环。
您还可以使用globstar
选项以递归方式bash
搜索以 结尾的文件.js
,然后使用 对其进行排序sort
。
首先您需要启用以下globstar
选项bash
:
shopt -s globstar
现在**/*.js
将找到带有扩展名的文件(和目录).js
。
因此,下面的方法应该可以解决问题:
for i in **/*.js; do [[ -f $i ]] && echo "$i"; done
[[ -f $i ]]
是为了确保我们只处理输出文件。
答案2
grep
是一款线路匹配工具。它适用于正在搜索的内容搜索文件,但不能搜索文件本身。
使用find
命令来执行此操作。默认情况下,Find 是递归的,并且有许多用于优化搜索的选项。
例如,如果我想以递归方式*.png
从/home
目录向下到子目录查找所有带有扩展名的常规文件(不是目录),我会告诉find
从目录开始/home
,搜索带有的文件-type
,并对以“.png”结尾的文件使用不区分大小写的匹配-iname
。
xieerqi:$ find /home -type f -iname "*.png" | head
/home/xieerqi/Downloads/35457542.png
/home/xieerqi/genymotion/icons/icon.png
/home/xieerqi/chinese-calendar-0.8.2/skin/default/ok.png
/home/xieerqi/chinese-calendar-0.8.2/skin/default/no.png
/home/xieerqi/chinese-calendar-0.8.2/skin/default/note.png
/home/xieerqi/chinese-calendar-0.8.2/skin/default/chinesecalendarBGyellow.png
/home/xieerqi/chinese-calendar-0.8.2/skin/blue/ok.png
/home/xieerqi/chinese-calendar-0.8.2/skin/blue/no.png
/home/xieerqi/chinese-calendar-0.8.2/skin/blue/note.png
/home/xieerqi/chinese-calendar-0.8.2/skin/blue/chinesecalendarBGblue.png