GNU/Linux >> Linux の 問題 >  >> Linux

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

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

Linux
  1. すでに存在し、何らかの形で保護されているLinux上のファイルを空にする(切り捨てる)方法は?

  2. 「diff -X」でファイル名ではなく特定のパスを無視するにはどうすればよいですか?

  3. スペースを含む AWK およびファイル名。

  1. Linuxでスペースと特殊文字を含むファイル名を操作する方法

  2. `^ m`そしてそれを取り除く方法は?

  3. テールとワイルドカード文字

  1. ファイルに構文の強調表示を表示する方法は?

  2. Grep一致しないファイルの表示を抑制する方法は?

  3. 1つのコマンドで2つのファイルタイプをRsyncしますか?