bash を使用して、glob 設定を設定して、一致がない場合にエラーが発生しないようにします。
shopt -u failglob # avoid failure report (and discarding the whole line).
shopt -s nullglob # remove (erase) non-matching globs.
ls ?c c?
疑問符は、単一の文字を表すグロブ文字です。 2 文字のファイル名が必要なので、そのうちの 1 つは c
でなければなりません 、つまり、最初の文字または最後の文字です。
shopt -s dotglob
で これにより、.c
という名前のファイルも表示されます .
一致するファイルがない場合、これらのシェル オプションを設定すると、すべての引数が削除され、むき出しの ls
になります。 -- デフォルトで何でも/すべてをリストします。
代わりにこれを使用してください:
shopt -s nullglob ## drop any missing globs
set -- ?c c? ## populate the [email protected] array with (any) matches
if [ $# -gt 0 ] ## if there are some, list them
ls -d "[email protected]"
fi
find
を使用するのがより良い方法だと思います :
find . -type f -name '*c*' -name '??'
それは再帰的に検索します。現在のディレクトリ内のファイルのみを一覧表示するには:
find . ! -name . -prune -type f -name '*c*' -name '??'
ファイルが存在する場合 (および \c
のようなエスケープ文字がない場合) )、グロブを使用できます:
echo ?c c?
これは、1 文字 (?
) のファイルに一致します。 ) に続く c
または c
を持つ その後に 1 文字 (?
).
ただし、ファイルの名前では失敗します -n
のようにダッシュで始まる または -e
または \c
のようなバックスラッシュ文字を使用 または \n
echo
で -e
の両方として と -n
(いくつかのシェル) echo
に特別です と \c
または \n
エスケープ シーケンスとして解釈されます (\c
出力を終了し、\n
逐語的な文字 \n
ではなく、改行を出力します オプション shopt -s xpg_echo
の場合、一部のシェル実装の echo と bash で 設定されています)。その他のアプリケーションまたはユーティリティ (ls
など) ) には他にもいくつかのオプションがあり、ダッシュで始まる他の多くのファイル名で失敗したり、ファイル名の他のエスケープ文字を解釈したりする可能性があります。
cc
という名前のファイルもリストします
-
ファイルがダッシュ (-n など) で始まる可能性がある場合は、次を使用します。
$ ls -d -- ?n -n
または、より良い:
$ ls -d ./?n ./-n
注意
-
グロブはファイルと一致しません。
<オール> -
ファイルが存在しない場合、グロブは展開されず、グロブは元の形式で出力されます。
$ echo ?m m? ?m m?
-
zsh 以外。
$ zsh -c 'echo ?m m?' zsh:1: no matches found: ./m?
シェルはエラーで終了します。
この動作は Zsh のnomatch
によって制御されます オプション。$ zsh -c 'setopt +o nomatch; echo ?m m?' ?m m?
または:
$ zsh -c 'echo ?m(N) m?(N)' ?m m?
しかし、それは
mm
を出力します -
bash では、シェル オプションが
failglob
の場合、zsh と同様の結果が得られます。 設定されています:$ bash -c 'shopt -s failglob; echo ?m m?' bash: no match: ?m
ただし、スクリプトは停止せず、シェルも終了しません。技術的には、グロブが使用されている行はそれ以上実行されませんが、次のスクリプト行で実行が再開されます。
-
bash では、オプション
nullglob
を設定できます 一致しないグロブを削除するには:$ bash -c 'shopt -s nullglob; echo ?m m? done' done
-
ls の使用 (他のプログラムと同様)
<オール> -
ファイルが一致しても問題はありませんが、ディレクトリも一致 (およびリスト) します:
$ ls ?c c? bc cz sc ac: hjk
-d
を使用することをお勧めしますls
で (ディレクトリは含まれますが、展開されません)。$ ls -d ?c c? ac bc cz sc
-
ファイル (またはディレクトリ) と一致しないグロブ
次に
ls
失敗を報告します$ ls ?m m? ls: cannot access '?m': No such file or directory
他のプログラムは (おそらく) しないかもしれません 同様のチェックを行います。
-
nullglob
の使用 bash を使用すると、空のリストが ls に渡されるため、コンテンツまたは pwd がls
のみのようにリストされます。 実行されました:$ ls ?m m? ac a.out cz 3 b sc ab bc
./
を使用して回避できます$ ls -d ./?m ./m? ls: cannot access './?m': No such file or directory ls: cannot access './m?': No such file or directory
または、find regex を使用できます (ただし、prune
でサブディレクトリをトラバースします) 行方不明) (これは cc というファイルを繰り返さないことに注意してください):
$ find . ! -name . -prune -regex '.*/\(.c\|c.\)'
./ac
./cc
./sc
./bc
./cz