lsコマンドの結果であるすべてのファイルを開くにはどうすればよいですか?


10

テキストエディターを使用してlsコマンドの結果であるすべてのテキストファイルを開きたいのですが。どうすればよいですか?

回答:


12

ジルは正確に右され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)

$()構成内のコマンドチェーンの出力は、エディターの引数として使用されます。私は時々これを2段階で行います。いくつかのファイルセットを調べて、文字列「content-type」を含むすべてのxmlファイルのリストを自分で取得するとします。

find -type f -iname '*xml' | xargs grep -Hi 'content-type' |  cut -d: -f1

...そして、それらを開きたいと決定します。次に、最後のコマンド履歴のショートカットを使用してこれを行います。

vim $(!!)

...私のお気に入りのエディターであるvimで、前のコマンドの結果をすべて開きます。

エディターが一度に1つのファイルしか受け入れず、エディターを起動し続ける必要がある場合は、stdioを必要とする端末ベースのエディターを使用しているかどうかに応じて、jmtdの回答orxargsまたはforループのバリアントを使用する必要があります。



@ギレス:正式に言及、私たち全員が見ることができなかった明白なことを指摘してくれてありがとう。@ c0smikdebrisどのファイルが名前だけでテキストであるかを明確に一致させる方法がない場合のために、ケースを含めて私の回答を完全に書き換えます。
カレブ

$()は実際に探していたものです。ここでは例としてlsを使用していることを述べました。両方の回答に+1。
c0smikdebris

「私のお気に入りのエディター」。@Caleb、答えの最初から多かれ少なかれ明らかであるため、指定する必要はありません、あはは!史上最高のエディター!
Enrico Maria De Angelis

4

現在のディレクトリで何か.txt(つまり*.txt)と呼ばれるすべてのファイルを開くには:

$EDITOR *.txt

どこ$EDITORお気に入りのエディタは例えば、あるgedit *.txtnano *.txtvim *.txtemacs *.txtまたは何でも。*現在のディレクトリ内のすべてのファイルを照合するためだけに使用します。

lsコマンドは含まれていないことに注意してください。の仕事lsは、実際にファイルのリストを表示することではありませんが、ディレクトリで呼び出すと発生します。どこにlsファイルの属性(更新時刻、アクセス権、サイズなど)を表示する際に有用です。特定のワイルドカードパターンに一致する一連のファイルに対して何かを行うには、シェルのグロブで十分です。

十分に高度なエディターでは、これを内部から行うことができます。たとえば、Emacsでは、通常のファイルを開くコマンド(C-x C-f)を使用して、と入力し*.txtます。

zshまたはbash≥4のサブディレクトリにあるファイルも照合する場合は、を使用できます$EDITOR **/*.txt


これは本当にエディター固有のものです。すべてのエディターがすべての無料のコマンドライン引数を開くファイルとして扱うことも、一度に複数のファイルを開くことをサポートすることも保証されていません。
jmtd

2

テキストエディターのニュアンスに依存します。高度なエディターは、1つのインスタンスでコマンドラインから複数のファイルを開くことを処理できます。ただし、たとえば、エディター(以下の例では$ EDITOR)は一度に1つしか開くことができないとします。あなたは適切なのパイプ出力をすべきfindxargs。これは、TTYを引き継がない$ EDITORにも依存します(そのため、グラフィカルなものを使用します)。

find . -maxdepth 1 -type f -name '*.c' -print0 | xargs -r0n 1 $EDITOR

コンソールエディターを使用する場合はシェルループの方が適切ですが、多くの一般的ではないファイル名で(空白文字の折りたたみや置換などにより)失敗します。

for i in *.c; do $EDITOR "$i"; done

2
lsの出力を解析しないでください!$EDITOR *.cまたはを使用しfor i in *.c; do $EDITOR "$i"; doneます。
Gilles 'SO-悪をやめる'

良い点-適切に編集されています。
jmtd

for空白文字の折りたたみ/変更を含む多くのファイル名の場合、ケースは失敗することに注意してください。
jmtd

現在記述されているように、このforケースはすべてのファイル名で機能します(一部のエディターで始まる名前-または+一部のエディターで名前が変更される可能性があります。それfor i in ./*.cを修正します)。
Gilles「SO-邪悪なことをやめなさい」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.