Zuallererst ist das, was du versuchst, l| grep <filename>
schlecht. Tu es nicht. Hier ist der Grund.
l
Befehl ist wirklich ein Alias für ls -CF
$ type -a l
l is aliased to `ls -CF'
Standardmäßig in Ubuntu bash
, ls
ist ein Alias zu ls --color=auto
. Wie steeldriver in den Kommentaren hervorhob, --color=auto
soll die Einfärbung ausgeschaltet werden. In Ihrem speziellen Fall haben Sie alias ls="ls -alh --color"
und alias l="ls -CF"
, was im Grunde genommen dazu führt, dass ls -alh --color -CF
. Diese spezielle Schalterkombination sendet immer noch farbige Ausgaben über eine Pipe. Beispielsweise:
$ ls -alh --color -CF ~/TESTDIR | cat -A
^[[0m^[[01;34m.^[[0m/ ^[[01;34m..^[[0m/ 1.txt 2.txt 3.txt out.txt$
Beachten Sie, wie die .
und ..
Verzeichnisse haben gleiche Escape - Sequenzen.
Was bedeutet das alles?
Dies bedeutet, dass l
eine farbige Liste der Dateien nach Dateityp ausgegeben wird. Das Problem ist, dass die Einfärbung unter Verwendung von Escape-Sequenzen erfolgt . Das ist, was 1:34m
Dinge sind - sie sind Fluchtsequenzen für bestimmte Farben.
Das Hauptproblem ist, dass das Parsen ls
in Skripten oft zu falschen Ausgaben und zum Absturz von Skripten führt, einfach weil ls
Escape-Sequenzen wie oben erläutert und andere Sonderzeichen möglich sind. Weitere Informationen finden Sie in diesem Artikel: http://mywiki.wooledge.org/ParsingLs
Was solltest du tun:
Verwenden find
Befehl ein :
bash-4.3$ ls
1.txt 2.txt 3.txt out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt
Sie könnten so etwas mit Shell Glob und modernen Testbefehlen machen [[
:
bash-4.3$ for file in * ;do if [[ "$file" =~ "1" ]] ;then echo "$file" ;fi ; done
1.txt
Oder verwenden Sie Python, das eine weitaus bessere Dateibehandlung bietet als bash
allein
bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']
Wenn die Ausgabe von nicht verarbeitet werden muss, kann auch das ls
einfache Verschieben mit ls
die Arbeit erledigen. (Denken Sie daran, dies ist nur zum Anzeigen einer Liste von Dateien gedacht, nicht zum Weitergeben an ein anderes Programm, um den ausgegebenen Text zu verarbeiten.)
bash-4.3$ ls *1*
1.txt