まず第一に、あなたがやろうとしていること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
シェルグロブと最新のテスト[[
コマンドを使用すると、次のようなことができます。
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