ファイル名の長さですべてのファイルを検索したいです。
たとえば、などの長さ 1 のファイルを検索する場合a.go
、b.go
置いた:
grep '.\{1\}' file
しかし、これは機能しません。ファイル名の長さでファイルを検索するには、どのコマンドを使用できますか?
答え1
ファイル名だけを検索したい場合は、次のコマンドを使用できます。
find -exec basename '{}' ';' | egrep '^.{100,}$'
これにより、 が実行されfind
、 を使用してファイル名またはディレクトリ名が取得され、100 文字以上のファイル名またはディレクトリ名が検索されます。正確な長さのファイル名を検索する場合は、の代わりにbasename
を使用します。{100}
{100,}
パスを含むファイル名を検索する場合は、次のようにします。
find | egrep '/[^/]{100,}$'
これにより、find コマンドを実行した場所への相対パスを含むファイル名が返されます。
答え2
grep
ファイルの内容のパターンを探します。名前ファイルについては、シェル glob を使用できます (現在のディレクトリ内のファイル名のみを考慮したい場合)。
echo ?.go
(ちなみに、グロブを評価するのはコマンドではなくシェルですecho
。)
現在のディレクトリから始めて、ディレクトリを再帰的に検索する場合、使用するツールは次のとおりですfind
。
find . -name '?.go'
find
(が呼び出される前にシェルがパターンを glob として評価するのを防ぐために、パターンを引用符で囲む必要があることに注意してください。)
答え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}\.[^.]+$'
注: 上記の解決策は、改行文字などを含まない比較的正常なファイル名があることを前提としています。また、長さを計算するときにファイル名内のスペースを無視せずにカウントするため、期待どおりにならない可能性があります。これらのいずれかが問題である場合は、お知らせください。回答を更新します。
答え4
指定する必要はありませんが、ファイルがディレクトリ構造内にある場合は、次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