web-dev-qa-db-ja.com

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

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

たとえば、a.gob.goなど、長さが1のファイルを検索する場合。

置いた:

grep '.\{1\}' file

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

10

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

echo ?.go

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

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

find . -name '?.go'

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

3
200_success

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

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

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

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

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

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

8
Doug Harple

まず、grepはファイルのcontentsを検索しますが、ファイル名は検索しません。そのためには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フラグは、PCREである{n}に必要なPerl互換正規表現をアクティブにします。$は、「文字列の末尾に一致する」ことを意味します。

これを単に行うこともできます:

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

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

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

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

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

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

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

3
terdon

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

$ 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
1
slm

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

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

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

1

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

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

あなたの場合の使用:

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

実際のパスをyourpathに置き換える必要があります。-aAndを意味します-type fは通常のファイルのみを検索することを意味します。

クエリの?は、覚えているとすれば、DOSなどの1つの文字を意味します。

0
PersianGulf