ファイル名の長さですべてのファイルを検索したい。
たとえば、私は、次のような長さ1のファイルを、検索したい場合はa.go
、b.go
。
置いた:
grep '.\{1\}' file
しかし、これは機能しません。ファイル名の長さでファイルを検索するには、どのコマンドを使用できますか?
ファイル名の長さですべてのファイルを検索したい。
たとえば、私は、次のような長さ1のファイルを、検索したい場合はa.go
、b.go
。
置いた:
grep '.\{1\}' file
しかし、これは機能しません。ファイル名の長さでファイルを検索するには、どのコマンドを使用できますか?
回答:
grep
ファイルの内容からパターンを探します。ファイルの名前を確認したい場合は、シェルグロブを使用できます(現在のディレクトリのファイル名のみを考慮したい場合)。
echo ?.go
(ちなみに、グロブを評価するのはecho
コマンドではなくシェルです。)
現在のディレクトリから始めてディレクトリを再帰的に調べたい場合、使用するツールはfind
次のとおりです。
find . -name '?.go'
(シェルfind
が呼び出される前にシェルがグロブとして評価しないように、パターンを引用する必要があることに注意してください。)
ファイル名だけを検索したい場合は、次のコマンドを使用できます。
find -exec basename '{}' ';' | egrep '^.{100,}$'
それが実行されfind
、を使用basename
してファイルまたはディレクトリの名前を取得し、少なくとも100文字のファイル名またはディレクトリ名を探します。正確な長さのファイル名を検索する場合は、{100}
ではなくを使用してください{100,}
。
パスを含むファイル名を検索する場合は、次のようにします。
find | egrep '/[^/]{100,}$'
これは、findコマンドを実行した場所への相対パスを含むファイル名を返します。
まず、ファイル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}\.[^.]+$'
注:上記の解決策は、改行文字などを含まない比較的健全なファイル名を使用していることを前提としています。また、必要としない長さを計算するときに、ファイル名のスペースは無視されません。これらのいずれかが問題である場合はお知らせください。回答を更新します。
指定しませんが、ファイルがディレクトリ構造内にある場合は、次を使用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
ggrep
:heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html。また、このQはOSXとしてタグ付けされていなかったため、の使用grep
は適切です。
ls ?.*
望ましい結果が得られるはずです。
a.go
は長さ4のファイル名です。a
は長さ1のファイル名です。これはUnixであり、DOSではなく、名前と拡張子が分かれており、暗黙的.
にファイル名の一部になっています。