web-dev-qa-db-ja.com

ワイルドカードが埋め込まれた「検索」検索で隠しファイルとディレクトリを除外/無視する方法は?

ワイルドカードの前後に注意してください "some text")

find . -type f -name '*some text*'

すべての隠しファイルとディレクトリをどのように除外/無視できますか?

私はすでに グーグルで長すぎます 、いくつかの-Pruneと! (感嘆符)パラメーター、ただし適切な(およびand約的な)例は機能しません

Piping|からgrepへのオプションはオプションであり、その例も歓迎します。しかし、主に短いワンライナー(または同じコマンドラインの目標を達成するさまざまな方法を示すいくつかのスタンドアロンのワンライナーに興味があります)justusing find .

ps: Linuxのファイルを検索し、特定のディレクトリを除外する は密接に関連しているように見えますが、a)はまだ受け入れられておらず、b)は関連しているが異なるが、c)インスピレーションとヘルプを提供する可能性があります混乱を正確に指摘してください!

編集

find . \( ! -regex '.*/\..*' \) -type f -name "whatever"、動作します。正規表現は、「何でも、次にスラッシュ、次にドット、そして何でも」(つまり、サブフォルダーを含むすべての隠しファイルとフォルダー)、および「!」を探します。正規表現を無効にします。

118

answer私はもともと上記の最初の質問に対する「編集」として投稿しました:

find . \( ! -regex '.*/\..*' \) -type f -name "whatever"、動作します。正規表現は、「何でも、次にスラッシュ、次にドット、そして何でも」(つまり、サブフォルダーを含むすべての隠しファイルとフォルダー)、および「!」を探します。正規表現を無効にします。

2

これは、隠しファイルとディレクトリをスキップして、ディレクトリの子孫であるすべてのファイルを印刷します。

find . -not -path '*/\.*'

そのため、名前にsome textを含むファイルを探していて、隠しファイルとディレクトリをスキップしたい場合は、次を実行します:

find . -not -path '*/\.*' -type f -name '*some text*'

説明:

-pathオプションを実行すると、パス文字列全体に対してパターンがチェックされます。 *はワイルドカード、/はディレクトリ区切り記号、\.はドット(特別な意味を避けるためにエスケープする必要があります)、*は別のワイルドカードです。 -notは、このテストに一致するファイルを選択しないことを意味します。

findは、前のコマンドで隠しディレクトリを再帰的に検索するのを避けるほど賢いとは思わないので、速度が必要な場合は、代わりに-Pruneを使用してください。

 find . -type d -path '*/\.*' -Prune -o -not -name '.*' -type f -name '*some text*' -print
131
Flimm

これは、BSD、Mac、Linuxでも正常に動作するドットファイルを除外する数少ない方法の1つです。

find "$PWD" -name ".*" -Prune -o -print
  • $PWD現在のディレクトリへのフルパスを出力して、パスが./で始まらないようにします
  • -name ".*" -Pruneは、ドットで始まり、その後下降しないファイルまたはディレクトリに一致します
  • -o -printは、前の式が何とも一致しなかった場合にファイル名を出力することを意味します。 -printまたは-print0を使用すると、他のすべての式はデフォルトで印刷されません。
10
eradman
find $DIR -not -path '*/\.*' -type f \( ! -iname ".*" \)

すべての隠しディレクトリ、および$ DIRの下の隠しファイルを除外します

4
guest

そのためにfindを使用する必要はありません。次のように、シェル自体でglobstarを使用するだけです。

echo **/*foo*

または:

ls **/*foo*

ここで、**/は再帰的にフォルダを表し、*foo*は名前にfooを含むファイルを表します。

デフォルトでは、lsを使用すると、隠しファイルとディレクトリを除くファイル名が出力されます。

グロビングを有効にしていない場合は、shopt -s globstarで実行します。

注: 新しいグロビングオプション は、Bash 4、zsh、および同様のシェルで機能します。


例:

$ mkdir -vp a/b/c/d
mkdir: created directory 'a'
mkdir: created directory 'a/b'
mkdir: created directory 'a/b/c'
mkdir: created directory 'a/b/c/d'
$ touch a/b/c/d/foo a/b/c/d/bar  a/b/c/d/.foo_hidden a/b/c/d/foo_not_hidden
$ echo **/*foo*
a/b/c/d/foo  a/b/c/d/foo_not_hidden
2
kenorb

@Flimmの answer は、が適切です。特に、findが隠しディレクトリに下がらないようにするためです。私はこの単純化を好む:

一般に、すべての隠しパス(通常のファイル、ディレクトリなど)を除外するには:

find <start-point> -path '*/.*' -Prune -o <expression> -print

たとえば、作業ディレクトリを開始点として使用し、-name '*some text*'を式として使用します。

find . -path '*/.*' -Prune -o -name '*some text*' -print

@Flimmの答えが示唆するものとは対照的に、隠しファイルや隠しディレクトリはありません。 -path '*/.*'式は、ファイルセパレータ.の直後に/があるすべてのパス(通常のファイル、ディレクトリなど)に対してtrueです。したがって、この行は隠しファイルとディレクトリの両方を整理します。

隠しディレクトリを除外しながら隠しファイルを許可すると、さらにフィルターが必要になります。これは、プルーニングされる式に-type dを含める場所です。

find <start-point> -type d -path '*/.*' -Prune -o <expression> -print 

例えば:

find . -type d -path '*/.*' -Prune -o -name '*some text*' -print

この場合、-type d -path '*/.*'はディレクトリに対してのみtrueであるため、ディレクトリのみがプルーニングされます。

1
De Novo
$ pwd
/home/victoria

$ find $(pwd) -maxdepth 1 -type f -not -path '*/\.*' | sort
/home/victoria/new
/home/victoria/new1
/home/victoria/new2
/home/victoria/new3
/home/victoria/new3.md
/home/victoria/new.md
/home/victoria/package.json
/home/victoria/Untitled Document 1
/home/victoria/Untitled Document 2

$ find . -maxdepth 1 -type f -not -path '*/\.*' | sed 's/^\.\///g' | sort
new
new1
new2
new3
new3.md
new.md
package.json
Untitled Document 1
Untitled Document 2

注:

  • .:現在のフォルダー
  • -maxdepth 1を削除して、再帰的に検索します
  • -type f:ディレクトリではなくファイルを検索します(d
  • -not -path '*/\.*'.hidden_filesを返さない
  • sed 's/^\.\///g':結果リストから先頭に追加された./を削除します
0
Victoria Stuart