我想使用文本编辑器打开ls命令产生的所有文本文件。我该怎么做呢?
我想使用文本编辑器打开ls命令产生的所有文本文件。我该怎么做呢?
Answers:
Gilles完全正确,这ls
是一个非常糟糕的例子,因为文件名glob扩展可以在命令行上轻松完成,而无需使用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中打开上一个命令的所有结果。
如果您的编辑器一次只接受一个文件,并且您需要保留大量编辑器,则您将需要在jmtd答案中使用xargs
or或for
loop 的变体,具体取决于您使用的是基于终端的需要stdio的编辑器。
要打开所有调用文件的东西.txt
(即*.txt
)在当前目录:
$EDITOR *.txt
哪里$EDITOR
是你最喜欢的编辑器,例如gedit *.txt
,nano *.txt
,vim *.txt
,emacs *.txt
或什么的。仅*
用于匹配当前目录中的所有文件。
请注意,该ls
命令不涉及。ls
尽管您在目录上调用文件时会发生,但它的工作并不是真正显示文件列表。其中ls
是有用是在显示文件属性(修改时间,权限,大小等)。要仅对匹配某个通配符模式的一堆文件执行某些操作,shell的glob就足够了。
足够高级的编辑器使您可以从内部进行此操作。例如,在Emacs中,只需使用常规文件打开命令(C-x C-f
),然后输入*.txt
。
如果您还想匹配子目录(zsh或bash≥4)中的文件,则可以使用$EDITOR **/*.txt
。
这取决于您的文本编辑器的细微差别。高级编辑器可以在一个实例中处理从命令行打开多个文件的情况。但是,举例来说,您的编辑器(在下面的示例中为$ EDITOR)一次只能打开一个。您应该将适当的输出通过管道传递find
到中xargs
。这还取决于$ EDITOR是否不接管TTY(因此,使用图形方式)
find . -maxdepth 1 -type f -name '*.c' -print0 | xargs -r0n 1 $EDITOR
如果要使用控制台编辑器,则使用shell循环可能更合适,但是如果使用许多不常见的文件名会失败(通过折叠或替换空白字符和其他各种方式):
for i in *.c; do $EDITOR "$i"; done
for
情况对于许多文件名都将失败,包括折叠/更改空白字符。
for
情况适用于每个文件名(可能以某些编辑器开头-
或+
以某些编辑器开头的名称除外;for i in ./*.c
它将对此进行修复)。
editor-command *.css
,等等