ファイル名の長さでファイルを探す

ファイル名の長さでファイルを探す

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

たとえば、長さ1のファイルを見つけるにはa.gob.go

私は次を置いた:

grep '.\{1\}' file

しかし、これはうまくいきません。ファイル名の長さでファイルを見つけるには、どのコマンドを使用できますか?

答え1

ファイル名のみを検索するには、次のコマンドを使用します。

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

このコマンドは、を実行し、findファイル名またはディレクトリ名を抽出し、少なくともbasename100文字のファイル名またはディレクトリ名を見つけます。ファイル名の正確な長さ{100}を見つけるには{100,}

パスを含むファイル名を見つけるには、次のようにします。

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

これにより、findコマンドが実行された相対パスを含むファイル名が返されます。

答え2

grepファイルの内容でパターンを探します。見たいなら名前これらのファイルにはシェルglobを使用できます(現在のディレクトリのファイル名のみを考慮する場合)。

echo ?.go

(ところで、globを評価するのはcommandではなくシェルですecho。)

現在のディレクトリから始めて繰り返しディレクトリを見つけるために使用するツールは次のとおりですfind

find . -name '?.go'

(シェルがパターンを呼び出す前にglobで評価するのを防ぐには、パターンを引用する必要があります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コマンドは単に削除します./。このフラグは、PCRE に必要な-PPerl 準拠の正規表現を有効にし、「文字列の終わりと一致」を意味します。{n}$

単に次のようにすることもできます。

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

関連情報