web-dev-qa-db-ja.com

隠しファイルでコマンドを実行する

すべてのファイルでフレーズを検索するコマンドを実行します:

cat *.* | grep blabla

正常に動作しますが、隠しファイルとディレクトリに問題があります。コマンドは単にそれらを処理しません。この問題を解決するには?

4
vico

デフォルトでは、隠しファイル(つまり、ピリオドで始まるファイル)は、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を使用して、後でオプションの設定を解除できます

7
steeldriver

論理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
3

「隠しファイル」は、名前がドットで始まる単なるファイルです。 GUIアプリケーションでは、これらのファイルは通常名前が表示されません。

Shell globbing を使用できます。

cat {*,.*} | grep blabla

前のコマンドには、ドットのないすべてのファイル(*)とドットで始まるすべてのファイル(.*)が含まれています。

ちなみに、これは catの無駄な使用 であり、代わりに次のようにコマンドを記述する必要があります。

grep blabla {*,.*} 
3
dr01