ファイル名の長さでファイルを検索する


10

ファイル名の長さですべてのファイルを検索したい。

たとえば、私は、次のような長さ1のファイルを、検索したい場合はa.gob.go

置いた:

grep '.\{1\}' file

しかし、これは機能しません。ファイル名の長さでファイルを検索するには、どのコマンドを使用できますか?


a.goは長さ4のファイル名です。 aは長さ1のファイル名です。これはUnixであり、DOSではなく、名前と拡張子が分かれており、暗黙的.にファイル名の一部になっています。
Peter Cordes

回答:


3

grepファイルの内容からパターンを探します。ファイルの名前を確認したい場合は、シェルグロブを使用できます(現在のディレクトリのファイル名のみを考慮したい場合)。

echo ?.go

(ちなみに、グロブを評価するのはechoコマンドではなくシェルです。)

現在のディレクトリから始めてディレクトリを再帰的に調べたい場合、使用するツールはfind次のとおりです。

find . -name '?.go'

(シェルfindが呼び出される前にシェルがグロブとして評価しないように、パターンを引用する必要があることに注意してください。)


1
これは、パターン「?.go」にも一致するディレクトリも検索します。
slm

@slm、ディレクトリは多くのタイプのファイルの1つであり、OPはどのタイプのファイルを追跡したかを指定しませんでした。
ステファンChazelas

8

ファイル名だけを検索したい場合は、次のコマンドを使用できます。

find -exec basename '{}' ';' | egrep '^.{100,}$'

それが実行されfind、を使用basenameしてファイルまたはディレクトリの名前を取得し、少なくとも100文字のファイル名またはディレクトリ名を探します。正確な長さのファイル名を検索する場合は、{100}ではなくを使用してください{100,}

パスを含むファイル名を検索する場合は、次のようにします。

find | egrep '/[^/]{100,}$'

これは、findコマンドを実行した場所への相対パスを含むファイル名を返します。


3

まず、ファイルgrep内容を検索しますが、ファイル名は検索しません。そのためにあなたがしたいですfind。ファイル名の長さを設定するオプションはありませんが、出力を解析して必要なものを取得できます。以下は、以下のファイルを含むディレクトリで実行するいくつかの例です。

$ tree
.
├── a
├── ab
├── abc
├── abcd
└── dir
    ├── a
    ├── ab
    ├── abc
    └── abcd

このディレクトリでファイルを検索すると、次が返されます。

$ find . -type f | sort
./a
./ab
./abc
./abcd
./dir/a
./dir/ab
./dir/abc
./dir/abcd

したがって、長さがXのファイルを見つけるには、パスを削除し、最後の文字の後の文字のみを照合する必要があります/

 $ find . -type f | grep -P '/.{3}$'

sedコマンドは単に削除されます./。この-Pフラグは、Perl互換の正規表現をアクティブにします。{n}これは、PCREで$「文字列の末尾に一致する」という意味です。

あなたは単にこれを行うこともできます:

find . -type f | grep -P '/...$'

15ドットを入力して15の長さのファイル名に一致させる小さな数字は、あまり効率的ではありません。

最後に、拡張子を無視してファイル名のみを一致させる場合は、次のようにします(@slmの提案どおり)。

find . -type f | grep -P '/.{1}\.'

ただし、これはのようなファイルも検索しますa.bo.go。これは、ファイル名に複数のファイルを含めることができる場合に適しています.

find . -type f | grep -P '/.{1}\.[^.]+$'

注:上記の解決策は、改行文字などを含まない比較的健全なファイル名を使用していることを前提としています。また、必要としない長さを計算するときに、ファイル名のスペースは無視されません。これらのいずれかが問題である場合はお知らせください。回答を更新します。


1

指定しませんが、ファイルがディレクトリ構造内にある場合は、次を使用findして、長さが1のファイルを見つけることができますgrep

$ find . -type f  | grep -P '/.{1}\.'

$ find . -type f  | grep -P '/.{1}\.' | head -10
./util-linux-2.19/include/c.h
./88366/a.bash
./89186/a.bash
./89563/b.txt
./89563/a.txt
./89563/c.txt
./89563/d.txt
./91734/2.c
./91734/4.c
./91734/1.c

MacOS Xでは、egrepを使用して-Pオプションを削除します
Bart Kummel

@BartKummel-実際に使用するOSXの場合ggrepheystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html。また、このQはOSXとしてタグ付けされていなかったため、の使用grepは適切です。
slm

1

私はこのようなものを使用します。

find . -type f -name "?.go"

つまり、「?」を2つ置くと 次に、2文字と拡張子を持つファイル名を探しています。


0

findコマンドで通常の表現を使用する場合は、次の""ように使用する必要があります。

find /var/log -iname "*.err" 

あなたの場合の使用:

find yourpath -type f -a -name "?.go"

あなたは、yourpathであなたの実際のパスに置き換える必要があります-a手段And -type fだけ通常のファイルを探していることを意味します。

? 思い出すと、クエリのとは、DOSなどの1つの文字を意味します。


-1

ls ?.* 望ましい結果が得られるはずです。


Unix.SEへようこそ。残念ながら、すでに良い答えがたくさんある古い質問に回答を追加することは役に立ちません。(古い問題を解決するための新しいより良い方法がないか、古い答えのどれよりも優れた解決策がない限り。)いくつかの質問に答えたい場合は、フロントページの新しい質問を見てください。
Peter Cordes
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.