Prima di tutto, quello che stai cercando di fare l| grep <filename>
è male. Non farlo Ecco perché.
l
il comando è davvero un alias di ls -CF
$ type -a l
l is aliased to `ls -CF'
Di default in Ubuntu bash
, ls
è un alias di ls --color=auto
. Come ha sottolineato steeldriver nei commenti, --color=auto
si suppone di disattivare la colorazione. Nel tuo caso specifico, hai alias ls="ls -alh --color"
e alias l="ls -CF"
, che sostanzialmente finisce per essere ls -alh --color -CF
. Questa particolare combinazione di interruttori invia ancora output colorato su un tubo. Per esempio:
$ ls -alh --color -CF ~/TESTDIR | cat -A
^[[0m^[[01;34m.^[[0m/ ^[[01;34m..^[[0m/ 1.txt 2.txt 3.txt out.txt$
Notare come le directory .
e ..
abbiano le stesse sequenze di escape.
Che cosa significa tutto questo
Ciò significa che l
verrà visualizzato un elenco di file colorato in base al tipo di file. Il problema è che la colorazione avviene con l'uso di sequenze di escape . Ecco cosa 1:34m
sono: sono la sequenza di escape per colori specifici.
Il problema principale è che l'analisi ls
spesso porta a output errati e disastri negli script, semplicemente perché ls
consente sequenze di escape come spiegato in precedenza e altri caratteri speciali. Vedi questo articolo per maggiori informazioni: http://mywiki.wooledge.org/ParsingLs
Cosa dovresti fare:
Usa il find
comando:
bash-4.3$ ls
1.txt 2.txt 3.txt out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt
Potresti fare qualcosa del genere con shell glob e moderno [[
comando di test :
bash-4.3$ for file in * ;do if [[ "$file" =~ "1" ]] ;then echo "$file" ;fi ; done
1.txt
O forse usa python, che ha capacità di gestione dei nomi dei file molto migliori rispetto al bash
solo
bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']
Se non è necessario elaborare l'output di ls
, anche il semplice globbing ls
può fare il lavoro. (Ricorda, questo è solo per visualizzare l'elenco di file, non per passarlo a un altro programma per gestire il testo di output)
bash-4.3$ ls *1*
1.txt