このような場合、Find + Grepよりもfindをより効率的に使用できますか?

このような場合、Find + Grepよりもfindをより効率的に使用できますか?

ファイル名の一部に基づいて現在のフォルダとサブフォルダのファイルを検索することがよくあります。この場合、find + grepただfind。例えば

find . | grep user   #19 chars typed

find でのみ作成できます。

find . -path "user*" #21 chars typed

ファイルを見つけるために設計されたコマンドを使用するとき、より多くの文字を入力し、それらの2つを組み合わせて使用​​するのは少し愚かな感じです。

文字入力時にfindだけをより効率的にする方法はありますか?

答え1

はい、

ff () {
    find . -path "*$1*"
}

関数は次のように呼び出されます。

ff user

そして、与えられた文字列を含む現在のディレクトリ内または下のすべてのパス名(ファイル、ディレクトリなど)を返します。

~/.bashrc関数定義はファイル(またはシェルで使用されている対応するシェル初期化ファイル)に入る必要があり、次に開始する対話型シェルで使用できます。


次のバリエーションは、パス名のファイル名部分のみを考慮します。

ff () {
    find . -name "*$1*"
}

結果を次に制限する場合一般ファイルをクリックしてから通話-type fに追加します。find

ff () {
    find . -type f -name "*$1*"
}

コマンドに注意してください。

find . -path "user*"

何も出力されません。これは、考慮されるすべてのパス名がで始まるためです.

最後の警告:私はこれがインタラクティブに使用されると仮定しています。到着バラより結果から。これをスクリプトで使用したり、関数から返されたファイル名に対して反復を実行したい場合検索結果を繰り返すのはなぜ悪い習慣ですか?」。

答え2

結局、これらのファイルで何かをしたいと仮定すると、シェル補完システムにリストを表示し、そのファイルの項目を選択するように指示できます。

たとえば、次のようになりますzsh

$echo**/*ユーザー*Tab
完全な拡張
[4/ユーザー] 1/2/3/ユーザー
すべての拡張を完了
1/2/3/ユーザー4/ユーザー
オリジナルを完成
**/*ユーザー*

次に、矢印キーを使用Alt+Aして選択したいファイル(または埋め込みファイル)を選択します(上記のように反転画像として表示されます[...])。Ctrl+D完成の選択を開始せずに完成のリストを参照してください。

これには、~/.zshrc少なくとも以下が含まれます。

zstyle ':completion:*' completer _expand _complete
zstyle ':completion:*' menu select=0
zstyle ':completion:*' verbose true
zstyle ':completion:*' format 'Completing %d'
zstyle ':completion:*' group-name ''
autoload -Uz compinit
compinit

compinstall仕上げの好みを調整するために実行することをお勧めします。

上記で**/*user*返されたファイル名前埋め込みuser(隠しファイルと隠しディレクトリのファイルを除いて、(D)再度必要に応じてglob修飾子を追加してください)。ファイル用含めるuser、(**/*~^*user*必要に応じて)に変更します。set -o extendedglob~/.zshrc

これはソートされたリストを提供する利点もあります ls --colour/@

eval "$(dircolors ~/.dircolors)"
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}

あなたのための~/.zshrc

また、完成した出力はfind人が消費するように意図されているため、改行やその他の印刷できない文字を含むファイル名に関する問題を回避できます。

zsh有効な文字を形成しないバイトシーケンスを含むファイル名の問題(少なくともGNUの場合)もありませんfind(たとえば、UTF-8ロケールではディレクトリにファイルが見つかりません)。findfind -path '*user*'user$'St\xe9phane'

答え3

findパスが定義されていない場合、GNUバージョンはデフォルトで現在のディレクトリに設定されます。

find -name "user*" # 18 chars typed plus enter.

答え4

ご使用の場合、一度、pip install gringrinコマンドとユーティリティを入手できますgrind(現在はPython 2しかないようです。)

grindを使用すると、クエリは次のようになります。

grind user*

11文字です。

もちろん、Pythonメソッドを使用している場合は、最も頻繁に実行される検索を実行するようにカスタマイズされたflocというファイルを常にパスに配置できます。

#!/usr/bin/env python3
from glob import glob
import sys
for arg in sys.argv[1:]:
   print('\n'.join(glob('**/{}*'.format(arg), recursive=True)))

その後、chmod +x floc実行可能にします。その後、あなたのクエリは次のようになります。

floc user

最大9文字。もちろん、元のコマンドのシェルエイリアスを作成して、同様の削減を得ることもできます。

関連情報