私は反対のことを実行したい:
find . -name "*2013*"
名前に文字列「2013」を含まない現在のディレクトリ内のすべてのファイルを検索します。どうやってやるの?
私は反対のことを実行したい:
find . -name "*2013*"
名前に文字列「2013」を含まない現在のディレクトリ内のすべてのファイルを検索します。どうやってやるの?
回答:
単に:
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*'
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
特定の文字列(ここでは「2013」)を含まない現在のディレクトリ内のすべてのファイルを検索します。
find . ! -name "*2013*" -type f
ls
パターンがどのファイルにも一致しない場合はエラーメッセージが返されます)。またksh
、リストがソートされることに注意してください。