次のファイルのリストがあります。
$ 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つのシナリオを解決しています。
a
現在のディレクトリで、およびの両方を含むファイル名を一致させようとしています。b
それからこのファイルで何かをしたいです。。- 改行を削除するために、2つのコマンドの出力を処理しようとしています
echo
。
ファイル名を繰り返すには、すべての名前と一致するパターンを作成し、ループ内でそのパターンの拡張を使用することをお勧めします。echo
これは個々のファイル名間の区別を排除するので推奨されません。
zsh
シェルでは、単一パターンがランダムな順序で表示される文字とすべての名前(*a*b*|*b*a*)
に展開されます。a
b
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つ以上のテキスト行(echo
2つの呼び出しの出力)を1行にソートすることです。その後、テキストをパイピングすることで実行できますpaste -s -
。これにより、ファイル名に含まれる改行文字も削除されます。paste
代わりにこの方法(改行文字も削除)を使用すると、tr -d '\n'
結果のテキストは最後に単一の改行文字で終了します。