web-dev-qa-db-ja.com

2つの文字を含み、そのうちの1つがcであるファイル名を表示するにはどうすればよいですか?

やってみましたls [a-z][a-z]、しかしそれは機能していないようです。

5
amendeep singh

Bashを使用して、一致の欠落がエラーをトリガーしないようにグロブ設定を設定します。

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 $@ array with (any) matches
if [ $# -gt 0 ]    ## if there are some, list them
  ls -d "$@"
fi
14
Jeff Schaller

findを使用する方が良いと思います。

find . -type f -name '*c*' -name '??'

それは再帰的に検索します。現在のディレクトリ内のファイルのみを一覧表示するには:

find . ! -name . -Prune  -type f -name '*c*' -name '??'
10
ctac_

bash内:

  • cの後に文字(_?c_)が続くか、または文字(_._とdotglobを含む)の後にc(_?c_)が続きます。

    _shopt -s extglob failglob dotglob
    printf '%s\n' @(?c|c?)
    _
  • cを含まないファイル(!(*c*))または2文字でないファイル(!(??))を除くすべてのファイル。ここでは、二重否定を使用して結合を実現しています。

    _shopt -s extglob failglob dotglob
    printf '%s\n' !(!(*c*)|!(??))
    _

zsh内:

  • printf '%s\n' (?c|c?)(D)

    (ここで、Ddotglobを有効にします。failglobnomatchではzshと呼ばれます)はデフォルトでオンになっています)。

  • _~_ except演算子と_^_否定拡張演算子を使用した二重否定:

    _set -o extendedglob
    printf '%s\n' *c*~^??(D)
    _

_ksh93_内:

  • ksh93にはnomatch/failglobオプションはありませんが、手動で行うことができます。

    _FIGNORE='@(.|..)' # only ignore . and .. and not the other dotfiles
    files=(~(N)@(?c|c?))
    if ((${#files[@]})); then
      printf '%s\n' "${files[@]}"
    else
      echo >&2 No match
      exit 1
    fi
    _

    (ここで~(N)は、そのグロブに対してnullglobを有効にします)。

  • _ksh93_には結合演算子があります。したがって、ここでは、files=(...)行を次のように変更することもできます。

    _files=(~(N)@(*c*&??))
    _
3