(Windows›;Cygwin›;grep›;记事本+;+;)用空格打开grep找到的文件

(Windows›;Cygwin›;grep›;记事本+;+;)用空格打开grep找到的文件,grep,cygwin,Grep,Cygwin,我在Cygwin中添加了记事本+。我希望能够通过一个命令找到文件并打开它们,我想这样做: npp $(grep -l -r 'phrase') 问题是它似乎无法打开名称中有空格的文件…:(是否可以修改此命令以执行此任务?grep-l使用换行符分隔文件名。您需要将换行符视为参数拆分器, 不要在普通的空间里分裂 此外,在生成要对其进行操作的文件列表时,xargs是有序的 $ grep -l -R 'regex' | xargs -d '\n' npp 如果文件名中可能有换行符(是的,在windo

我在Cygwin中添加了记事本+。我希望能够通过一个命令找到文件并打开它们,我想这样做:

npp $(grep -l -r 'phrase')

问题是它似乎无法打开名称中有空格的文件…:(是否可以修改此命令以执行此任务?

grep-l
使用换行符分隔文件名。您需要将换行符视为参数拆分器, 不要在普通的空间里分裂

此外,在生成要对其进行操作的文件列表时,xargs是有序的

$ grep -l -R 'regex' | xargs -d '\n' npp
如果文件名中可能有换行符(是的,在windows上不太可能),请使用null作为分隔符:

$ grep -l -R -Z 'regex' | xargs -0 npp

输入更少,引导更通用。

值得写下另一种解决这个问题的方法。 命令替换(即
$(
..
构造)将命令的输出拆分为单独的参数。 它在
$IFS
变量中的字符上拆分。 默认情况下,这三个空格字符是空格、制表符和换行符

由于您不太可能在文件名中遇到换行符或制表符, 一个选项是修补
$IFS
,删除空格字符

$ IFS=$'\t\n'
$ npp $(grep -l -r 'regex')

我不建议您在全球范围内更改您的
$IFS

引用可能会有所帮助,
npp“$(grep-l-r‘短语’)”
@WiktorStribiżew谢谢,不幸的是它没有:
cygpath:无法转换空路径
很抱歉错误地删除了您的评论。谢谢。我的测试文件有“ico”如果我使用:
$grep-l-R'ico'| xargs-d'\n'npp
我得到:
xargs:npp:没有这样的文件或目录
只是错误说明:xargs看不到命令调用npp。npp在
$PATH
上吗?它是别名吗?
$type npp
说什么?>“npp在$PATH上吗?它是别名吗?”在*.baschrc*文件(主目录)中,我添加了:
npp(){/cygdrive/c/Program\Files/Notepad++/Notepad++.exe-multiInst-nosession-noPlugin$(cygpath-w--“$”)}
>“npp是什么意思?”
npp是一个函数npp(){/cygdrive/c/Program\Files/Notepad++/Notepad++.exe-multiInst-nosession-noPlugin$(cygpath-w--“$@”)}
别名和shell函数仅在bash内部工作。Xargs需要实际的命令。因此,请将npp设置为shell脚本,并将其放置在
$PATH
上的文件夹中。还有其他选项,但它们不适合注释!>“将npp设置为shell脚本并将其放置在$PATH上”你愿意指出如何做到这一点吗?我是这个领域的初学者,我可以研究如何制作“shell脚本”,但我不知道我应该在我的“$PATH”上放什么。>“我不建议你在全球范围内更改$IFS。”为什么?(我应该问这个问题,还有什么地方比这个线程更好?)其他脚本可能依赖于其默认值,而且脚本设置
$IFS
的情况极为罕见。习惯用法是,如果您更改它,您应该在以后再更改它。IFS命令在我关闭Cygwin之前一直有效(即使我以管理员身份运行Cygwin)。我在Cygwin文件夹中搜索了IFS文件,但没有找到。但很好,它至少暂时有效:)。在此上下文中,IFS不是命令,它是一个shell变量。设置它时,它仅存在于该bash进程中。如果它具有export属性,它将被放置在该bash启动的任何新进程的环境中。IFS通常不会导出。bash响应许多变量。如果希望IFS始终具有非默认值,则将需要在bash的许多启动文件中的相应文件中设置它。感谢您澄清这一点。我需要在Google上搜索IFS值的存储位置:)。