如何打开ls命令生成的所有文件?


Answers:


12

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答案中使用xargsor或forloop 的变体,具体取决于您使用的是基于终端的需要stdio的编辑器。



@吉尔斯:杜利指出,感谢您指出我们所有人都看不到的明显现象。@ c0smikdebris请注意,我只是完全重写了我的答案,其中包括一个案例,即如果您没有明显的方式来仅根据文件名来匹配文本文件。
卡莱布

$()是我真正想要的。我应该提到我在这里以ls为例。对两个答案+1。
c0smikdebris 2011年

“我最喜欢的编辑器”。无需指定@Caleb,因为从答案开始就或多或少地很清楚,啊哈哈!有史以来最好的编辑器!
恩里科·玛丽亚·德·安吉利斯

4

要打开所有调用文件的东西.txt(即*.txt)在当前目录:

$EDITOR *.txt

哪里$EDITOR是你最喜欢的编辑器,例如gedit *.txtnano *.txtvim *.txtemacs *.txt或什么的。仅*用于匹配当前目录中的所有文件。

请注意,该ls命令不涉及。ls尽管您在目录上调用文件时会发生,但它的工作并不是真正显示文件列表。其中ls是有用是在显示文件属性(修改时间,权限,大小等)。要仅对匹配某个通配符模式的一堆文件执行某些操作,shell的glob就足够了。

足够高级的编辑器使您可以从内部进行此操作。例如,在Emacs中,只需使用常规文件打开命令(C-x C-f),然后输入*.txt

如果您还想匹配子目录(zsh或bash≥4)中的文件,则可以使用$EDITOR **/*.txt


那确实是特定于编辑器的。不能保证所有编辑器都会将其所有免费命令行参数都视为要打开的文件,也不保证一次打开多个文件。
2011年

2

这取决于您的文本编辑器的细微差别。高级编辑器可以在一个实例中处理从命令行打开多个文件的情况。但是,举例来说,您的编辑器(在下面的示例中为$ 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

2
不要解析ls的输出!使用$EDITOR *.cfor i in *.c; do $EDITOR "$i"; done
吉尔(Gilles)'所以

不错-编辑适当。
2011年

请注意,这种for情况对于许多文件名都将失败,包括折叠/更改空白字符。
2011年

就像现在写的那样,这种for情况适用于每个文件名(可能以某些编辑器开头-+以某些编辑器开头的名称除外;for i in ./*.c它将对此进行修复)。
吉尔(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.