(ワイルドカードの前後に注意してください "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"
、動作します。正規表現は、「何でも、次にスラッシュ、次にドット、そして何でも」(つまり、サブフォルダーを含むすべての隠しファイルとフォルダー)、および「!」を探します。正規表現を無効にします。
answer私はもともと上記の最初の質問に対する「編集」として投稿しました:
find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
、動作します。正規表現は、「何でも、次にスラッシュ、次にドット、そして何でも」(つまり、サブフォルダーを含むすべての隠しファイルとフォルダー)、および「!」を探します。正規表現を無効にします。
これは、隠しファイルとディレクトリをスキップして、ディレクトリの子孫であるすべてのファイルを印刷します。
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
これは、BSD、Mac、Linuxでも正常に動作するドットファイルを除外する数少ない方法の1つです。
find "$PWD" -name ".*" -Prune -o -print
$PWD
現在のディレクトリへのフルパスを出力して、パスが./
で始まらないようにします-name ".*" -Prune
は、ドットで始まり、その後下降しないファイルまたはディレクトリに一致します-o -print
は、前の式が何とも一致しなかった場合にファイル名を出力することを意味します。 -print
または-print0
を使用すると、他のすべての式はデフォルトで印刷されません。find $DIR -not -path '*/\.*' -type f \( ! -iname ".*" \)
すべての隠しディレクトリ、および$ DIRの下の隠しファイルを除外します
そのために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
@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
であるため、ディレクトリのみがプルーニングされます。
$ 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'
:結果リストから先頭に追加された./
を削除します