図が示すように、l
を使用して、現在のフォルダー内のファイルを取得します。そして、番号1
のファイルを取得したいので、pipe
とgrep
を使用します。
しかし、なぜ2
および22
ファイルが表示されるのでしょうか? 1;34m
とは何ですか?
$ l
./ ../ 1 11 2 22
$ l | grep "1"
1;34m./ 1;32m../ 1 11 2 22
更新
l
ファイルでコマンドzshrc
のエイリアスを既に作成しています。
alias lsp="ls"
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias ls="ls -alh --color"
そして、これはtype
コマンドの結果です:
>$ type ls
ls is an alias for ls -alh --color
> $ type l
l is an alias for ls -CF
まず第一に、あなたがやろうとしていること、l| grep <filename>
は悪いです。しないでください。その理由は次のとおりです。
l
コマンドは、実際にはls -CF
のエイリアスです
$ type -a l
l is aliased to `ls -CF'
Ubuntuのbash
のデフォルトでは、ls
はls --color=auto
のエイリアスです。スチールドライバーがコメントで指摘したように、--color=auto
は色付けをオフにするはずです。あなたの特定のケースでは、alias ls="ls -alh --color"
とalias l="ls -CF"
があり、これらは基本的にls -alh --color -CF
になります。この特定のスイッチの組み合わせは、色付きの出力をパイプ経由で送信します。例えば:
$ ls -alh --color -CF ~/TESTDIR | cat -A
^[[0m^[[01;34m.^[[0m/ ^[[01;34m..^[[0m/ 1.txt 2.txt 3.txt out.txt$
.
ディレクトリと..
ディレクトリのエスケープシーケンスが同じであることに注意してください。
つまり、l
は、ファイルの種類に応じて色分けされたファイルのリストを出力します。問題は、 エスケープシーケンス を使用すると色付けが発生することです。それが1:34m
のことです-特定の色のエスケープシーケンスです。
主な問題は、単純にls
が前述のようなエスケープシーケンスや他の特殊文字を許可するため、ls
の解析がスクリプトの誤った出力と障害につながることです。詳細については、この記事を参照してください: http://mywiki.wooledge.org/ParsingLs
find
コマンドを使用します。
bash-4.3$ ls
1.txt 2.txt 3.txt out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt
Shell globとモダンテスト[[
コマンドを使用して、次のようなことができます。
bash-4.3$ for file in * ;do if [[ "$file" =~ "1" ]] ;then echo "$file" ;fi ; done
1.txt
または、bash
単独よりもはるかに優れたファイル名処理機能を持つpythonを使用することもできます。
bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']
ls
の出力を処理する必要がない場合は、ls
を使用した単純なグロブ処理も実行できます。 (これはファイルのリストを表示するためだけであり、出力テキストを処理するために別のプログラムに渡すためではありません)
bash-4.3$ ls *1*
1.txt
トライアルでは、ls
エイリアス、つまり、1;34m
およびカラーリングから生じる同様のノイズを呼び出していました。パイプ|
はこれをすべて同じ行で受け取るため、grep
はその行のファイル1
と一致し、この行を出力します。これは画面に表示されるものです。
あなたがそのようなことをしているとき、システムコマンドに戻って行ごとに1つの結果を返すことは常に良いことです。
エイリアスを削除するには、\ls
と入力し、オプション-1
を使用して、改行で区切られた結果を出力します。
$ \ls -1 | grep "1"
1
11
注:バックスラッシュメソッドはすべてのコマンドで機能します。\command
は、エイリアスされていないシステムコマンドを呼び出すだけです。