我想使用文本编辑器打开 ls 命令结果的所有文本文件。我该怎么做呢?
答案1
吉尔斯说得完全正确,ls
是一个非常糟糕的例子,因为文件名全局扩展可以在命令行上更容易地完成,而无需使用ls
!如果您所谓的“文本文件”具有文件扩展名来识别它们,您可以执行以下操作:
editor-command *.txt
为了演示一种技术,让我们使用一个更复杂的示例,仅通过文件名匹配无法完成该示例,并根据内容而不是仅根据文件名打开文件。假设您想要打开包含字符串“content-type”的所有文件。
假设您的编辑器将接受多个文件名并在单独的缓冲区中一次打开它们或按顺序处理它们,您可以简单地运行:
editor-command $(grep -i content-type)
现在回到您原来的问题,假设您根据名称不知道它们是否是文本文件。然后,您需要使用另一个程序来识别它们,然后根据该数据打开它们。该程序file
会告诉您某个文件是什么类型,您可以 grep 该列表仅查找文本文件,然后仅打开匹配的文件名,如下所示:
editor-command $(file -ni * | grep 'text/plain' | cut -d: -f1)
构造内命令链的输出$()
将用作编辑器的参数。我有时会分两个阶段进行此操作。假设我正在查看一组文件,并获取包含字符串“content-type”的每个 xml 文件的列表
find -type f -iname '*xml' | xargs grep -Hi 'content-type' | cut -d: -f1
...并决定我要打开它们。然后,我使用最后一个命令历史记录快捷方式并执行以下操作:
vim $(!!)
...在我最喜欢的编辑器 vim 中打开上一个命令的所有结果。
如果您的编辑器一次只接受一个文件,并且您需要不断生成编辑器,则需要使用xargs
或for
循环的变体jmtd 的回答取决于您是否使用需要 stdio 的基于终端的编辑器。
答案2
要打开当前目录中名为 Something .txt
(即)的所有文件:*.txt
$EDITOR *.txt
您最喜欢的编辑器在哪里$EDITOR
,例如gedit *.txt
、nano *.txt
、vim *.txt
或emacs *.txt
其他什么。使用 just*
来匹配当前目录中的所有文件。
ls
请注意,不涉及该命令。的工作ls
并不是真正显示文件列表,尽管当您在目录上调用它时会发生这种情况。有用的地方ls
是显示文件属性(修改时间、权限、大小等)。为了对一堆匹配特定通配符模式的文件执行某些操作,shell 的球体就足够了。
足够先进的编辑器可以让您从内部完成此操作。例如,在 Emacs 中,只需使用普通文件打开命令 ( C-x C-f
) 并输入*.txt
。
如果你还想匹配子目录中的文件,在 zsh 或 bash ≥4 中,你可以使用$EDITOR **/*.txt
.
答案3
这取决于您的文本编辑器的一些细微差别。高级编辑器可能可以在一个实例中处理从命令行打开多个文件。但是,举例来说,您的编辑器(在下面的示例中为 $EDITOR)一次只能打开一个。您应该将适当的输出通过管道传输find
到xargs
.这也取决于 $EDITOR 不接管 TTY(因此,使用图形编辑器)
find . -maxdepth 1 -type f -name '*.c' -print0 | xargs -r0n 1 $EDITOR
如果您想使用控制台编辑器,shell 循环可能更合适,但 if 对于许多不常见的文件名会失败(通过折叠或替换空白字符和各种其他内容):
for i in *.c; do $EDITOR "$i"; done