Pertama-tama, apa yang Anda coba lakukan, l| grep <filename>
itu buruk. Jangan lakukan itu. Inilah sebabnya.
l
Perintah ini sebenarnya adalah alias untuk ls -CF
$ type -a l
l is aliased to `ls -CF'
Secara default di Ubuntu bash
, ls
adalah alias untuk ls --color=auto
. Seperti yang ditunjukkan steeldriver dalam komentar --color=auto
yang seharusnya mematikan pewarnaan. Dalam kasus spesifik Anda, Anda memiliki alias ls="ls -alh --color"
dan alias l="ls -CF"
, yang pada dasarnya berakhir ls -alh --color -CF
. Kombinasi sakelar khusus ini masih mengirimkan keluaran berwarna melalui pipa. Sebagai contoh:
$ ls -alh --color -CF ~/TESTDIR | cat -A
^[[0m^[[01;34m.^[[0m/ ^[[01;34m..^[[0m/ 1.txt 2.txt 3.txt out.txt$
Perhatikan bagaimana direktori .
dan ..
memiliki urutan pelarian yang sama.
Apa arti semua ini?
Ini berarti bahwa l
akan menampilkan daftar file berwarna sesuai dengan jenis file. Masalahnya adalah bahwa pewarnaan terjadi dengan penggunaan urutan melarikan diri . Itulah yang terjadi 1:34m
- mereka melarikan diri urutan untuk warna tertentu.
Masalah utama adalah bahwa parsing ls
sering menyebabkan output yang salah dan bencana dalam skrip, hanya karena ls
memungkinkan urutan melarikan diri seperti yang dijelaskan sebelumnya dan karakter khusus lainnya. Lihat artikel ini untuk info lebih lanjut: http://mywiki.wooledge.org/ParsingLs
Apa yang seharusnya Anda lakukan:
Gunakan find
perintah:
bash-4.3$ ls
1.txt 2.txt 3.txt out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt
Anda dapat melakukan sesuatu seperti ini dengan shell glob dan [[
perintah tes modern :
bash-4.3$ for file in * ;do if [[ "$file" =~ "1" ]] ;then echo "$file" ;fi ; done
1.txt
Atau mungkin menggunakan python, yang memiliki kemampuan menangani nama file yang jauh lebih baik daripada bash
sendirian
bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']
Jika tidak perlu memproses output ls
, globbing sederhana ls
dapat melakukan pekerjaan juga. (Ingat, ini hanya untuk melihat daftar file, bukan untuk meneruskannya ke program lain untuk berurusan dengan teks output)
bash-4.3$ ls *1*
1.txt