エコーファイル名には、順序に関係なく「a」と「b」が含まれています。

エコーファイル名には、順序に関係なく「a」と「b」が含まれています。

次のファイルのリストがあります。

$ echo *
add akfefg aka ab ba

「a」と「b」が順に含まれるファイル名をエコーし​​たいと思います。頑張った

echo *[ab]*[ba]*
aka ab ba

「aka」も印刷します。頑張った

$ echo *a*b* && echo *b*a*
ab
ba

私の役割を果たしますが、次の行に「ba」が印刷されます。これを行うより簡単な方法はありますか?ありがとうございます。

ベストアンサー1

この回答では、2つのシナリオを解決しています。

  1. a現在のディレクトリで、およびの両方を含むファイル名を一致させようとしています。bそれからこのファイルで何かをしたいです。
  2. 改行を削除するために、2つのコマンドの出力を処理しようとしていますecho

ファイル名を繰り返すには、すべての名前と一致するパターンを作成し、ループ内でそのパターンの拡張を使用することをお勧めします。echoこれは個々のファイル名間の区別を排除するので推奨されません。

zshシェルでは、単一パターンがランダムな順序で表示される文字とすべての名前(*a*b*|*b*a*)に展開されます。ab

bashシェルでは、単一の拡張globbingパターン(またはksh同様のglobbingパターン)を使用して@(*a*b*|*b*a*)同じことを実行できます。デフォルトでは、シェルはbash拡張グロービングモードを有効にしないため、まずそのモードを有効にする必要がありますshopt -s extglob

したがって、bashシェルでは次のようなものを使用できます。

shopt -s extglob

for name in @(*a*b*|*b*a*); do
    # process "$name" here
done

必要なファイル名を生成する別の方法処理のため以下を使用することですfind

find . ! -name . -prune -name '*a*' -name '*b*'

aこれにより、現在のディレクトリに含まれている名前とその両方を含む名前のみが検索されますb。その後、-execこのコマンドの最後に を使用して、操作を実行する他のユーティリティを呼び出すことができます。

find . ! -name . -prune -name '*a*' -name '*b*' -exec sh -c '
    for name do
        # process "$name" here
    done' sh {} +

ここではfind、インラインスクリプトの生成sh -cに使用されるファイル名です。また、見ることができます「find」の-execオプションについて

しかし、これがテキスト処理の練習の場合目的は、2つ以上のテキスト行(echo2つの呼び出しの出力)を1行にソートすることです。その後、テキストをパイピングすることで実行できますpaste -s -。これにより、ファイル名に含まれる改行文字も削除されます。paste代わりにこの方法(改行文字も削除)を使用すると、tr -d '\n'結果のテキストは最後に単一の改行文字で終了します。

おすすめ記事