普段はこんな感じで使っています
$ find -name testname.c
./dir1/dir2/testname.c
$ vi ./dir1/dir2/testname.c
ファイル名と場所をもう一度入力するのは面倒です。
ワンステップでこれを行うにはどうすればよいですか?
私はもう試した
$ find -name testname.c | xargs vi
しかし、私は失敗しました。
-exec
にパラメータを使用しますfind
。
$ find -name testname.c -exec vi {} \;
ただし、複数の一致が返された場合find
、ファイルは順番に開かれます。つまり、1 つを閉じると、次のものが開きます。それらすべてがバッファにキューイングされるわけではありません。
それらをすべてバッファで開くには、次を使用します。
$ vi $(find -name testname.c)
ところで、これは本当に vi であり、最近では vi がしばしばエイリアスされる Vim ではありませんか?
これは、bash で次のコマンドを使用して実行できます。
どちらかを使用
vi `find -name testname.c`
または使用
vi $(!!)
すでに入力している場合find -name testname.c
編集: 重複の可能性: bash - 最後に実行されたコマンドの出力を変数に自動的にキャプチャする
問題は、そこにある のxargs
すべての入力を引き継いvi
で (そして、他の手段がなく、代替手段が残りのファイル リストを渡しているため、 に渡され)、それを操作する方法が残されていないことです/dev/null
。vi
代わりにサブコマンドを使用することをお勧めします。
$ vi $(find -name testname.c)
悲しいことに、イニシャルを実行した後にこれを簡単に実行できる単純な呼び出しはありませんが、fc
事後にコマンドの両端に文字を追加するのは簡単です。r
find
私のお気に入りの解決策は、vim自体を使用することです。
:args `find -name testname.c`
ちなみに、VIMには拡張シェルグロブが組み込まれているので、
:args **/testname.c
これは、サブディレクトリツリーで再帰的に検索されます。
また、そのVIMにはコマンドラインでファイル名が補完されているため、実際に1つのファイルを探していることがわかっている場合は、
:e **/test
次に、を(繰り返し)押しTabて、サブディレクトリツリー内の一致するファイル名を切り替えます。
などよりも少し堅牢なものについてvi $(find -name testname.c)
は、次のようにして、空白やその他の解釈されたシェル文字を含むファイル名から保護します (ファイル名に改行が埋め込まれている場合は、神が助けてくれます)。この関数をシェル環境に挿入します。
# Find a file (or files) by name and open with vi.
function findvi()
{
declare -a fnames=()
readarray -t fnames < <(find . -name "$1" -print)
if [ "${#fnames[@]}" -gt 0 ]; then
vi "${fnames[@]}"
fi
}
次に、のように使用します
$ findvi Classname.java