ファイル名の長さですべてのファイルを探したいです。
たとえば、長さ1のファイルを見つけるにはa.go
、b.go
。
私は次を置いた:
grep '.\{1\}' file
しかし、これはうまくいきません。ファイル名の長さでファイルを見つけるには、どのコマンドを使用できますか?
答え1
ファイル名のみを検索するには、次のコマンドを使用します。
find -exec basename '{}' ';' | egrep '^.{100,}$'
このコマンドは、を実行し、find
ファイル名またはディレクトリ名を抽出し、少なくともbasename
100文字のファイル名またはディレクトリ名を見つけます。ファイル名の正確な長さ{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 に必要な-P
Perl 準拠の正規表現を有効にし、「文字列の終わりと一致」を意味します。{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