指定された文字列を含まないファイル名を見つける


19

私は反対のことを実行したい:

find . -name "*2013*"

名前に文字列「2013」を含まない現在のディレクトリ内のすべてのファイルを検索します。どうやってやるの?

回答:


28

単に:

find . ! -name '*2013*'

a ! -type dを追加して、タイプディレクトリのファイル(.それ自体と同様)を除外するか、他のすべてのタイプのファイル(ディレクトリ、FIFO、シンボリックリンク、デバイス、ソケット...)を除く通常のファイル-type fのみを含めます。

ただし*、0個以上の文字のシーケンスに一致することに注意してください。そのため、現在のロケールで有効な文字として完全にデコードできない何かが先行または後続する2013場合に含まれるファイル名を報告でき2013ます。

これは、異なるエンコーディングでエンコードされたファイル名の文字を複数バイトでエンコードできるロケール(UTF-8など)にいる場合に発生する可能性があります。たとえば、UTF-8ロケールでは、iso8859-15文字セット(0xe9バイトとして)でエンコードされているStéphane2013ファイルを報告しますé

ファイル名がロケールの文字セットでエンコードされていることを確認することをお勧めしますが、それを保証できない場合は、回避find策としてCロケールで実行します。

LC_ALL=C find . ! -name '*2013*'

4

Kshファイル名パターンで十分です:

# files with 2013
ls -d -- *2013*

# files without 2013
ls -d -- !(*2013*)

参照

シェルがbashの場合、shopt -s extglobこのパターンを使用する前に実行する必要があります(それをに入れることができます.bashrc)。シェルがzshの場合は、実行する必要がありますsetopt ksh_glob(それをに入れることができます.zshrc)。また、オファーをzshのls -d -- ^*2013*予備を必要とします、setopt extended_glob

これらのファイル名で何をしているかによってはls、使用するのに適切なコマンドではない場合があります。配列に保存するには

filenames=( !(*2013*) )
for f in "${filenames[@]}"; do ...; done

4
ただし、サブディレクトリでは再帰せず、ドットファイルはスキップされます(lsパターンがどのファイルにも一致しない場合はエラーメッセージが返されます)。またksh、リストがソートされることに注意してください。
ステファンシャゼル

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.