すべてのファイルでフレーズを検索するコマンドを実行します:
cat *.* | grep blabla
正常に動作しますが、隠しファイルとディレクトリに問題があります。コマンドは単にそれらを処理しません。この問題を解決するには?
デフォルトでは、隠しファイル(つまり、ピリオドで始まるファイル)は、bashシェルのグロブ拡張から除外されます。ただし、dotglob
設定を使用して変更できます。
$ mkdir dir
$ touch dir/.hidden dir/visible
$ echo dir/*
dir/visible
$ shopt -s dotglob
$ echo dir/*
dir/.hidden dir/visible
shopt -u dotglob
を使用して、後でオプションの設定を解除できます
論理ORフラグ(-o
)および-exec . . .\+
フラグを指定したfind
コマンドを使用します
find . -maxdepth 1 \( -iname "*.*" -o -iname ".*" \) -exec grep "MySearchTerm" {} \+
説明:
find
は、指定されたディレクトリ内のファイルを検索する再帰コマンドです。この場合、.
は現在の作業ディレクトリです。-maxdepth
フラグは、現在のディレクトリのみにとどまるように指示します。再帰的に移動する場合、または降下するサブディレクトリの数を指定する場合は、1
を目的のレベル数に変更します。\( . . .\)
部分は、シェルをfind
への引数のグループとして扱うのではなく、サブシェルとして扱うことを防ぎます。-iname
フラグを使用すると、検索するファイル名を指定できます。-o
フラグは、ファイル*.*
または先頭のドット(隠しファイル)で始まるファイルを検索するようにfindに指示します。-exec . . .{}
構造により、特定のコマンドを実行して、見つかったファイルを操作できます。 \+
はfind
に、実行したいコマンドの引数としてすべてのファイル(この場合はgrep
)を取るように伝えます。SEARCHFILE.txt
と.SEARCHFILE.txt
の両方が見られる小さな例を次に示します。
DIR:/xieerqi
skolodya@ubuntu:$ find . -maxdepth 1 \( -iname "*.*" -o -iname ".*" \) -exec grep "HelloWorld" {} \+ 2>/dev/null
./SEARCHFILE.txt:HelloWorld ! I'm found
./localDir.txt:HelloWorld.so
./localDir.txt:HelloWorld.c
Binary file ./2015-05-05-raspbian-wheezy.img matches
./.SEARCHFILE.txt:HelloWorld ! I'm found
「隠しファイル」は、名前がドットで始まる単なるファイルです。 GUIアプリケーションでは、これらのファイルは通常名前が表示されません。
Shell globbing を使用できます。
cat {*,.*} | grep blabla
前のコマンドには、ドットのないすべてのファイル(*
)とドットで始まるすべてのファイル(.*
)が含まれています。
ちなみに、これは catの無駄な使用 であり、代わりに次のようにコマンドを記述する必要があります。
grep blabla {*,.*}