Trước hết, những gì bạn đang cố gắng làm, l| grep <filename>
là xấu. Đừng làm điều đó. Đây là lý do tại sao.
l
lệnh thực sự là một bí danh để ls -CF
$ type -a l
l is aliased to `ls -CF'
Theo mặc định trong Ubuntu bash
, ls
là một bí danh ls --color=auto
. Như Steeldo đã chỉ ra trong các ý kiến --color=auto
được cho là tắt màu. Trong trường hợp cụ thể của bạn, bạn có alias ls="ls -alh --color"
và alias l="ls -CF"
, về cơ bản kết thúc là ls -alh --color -CF
. Sự kết hợp đặc biệt này của các công tắc vẫn gửi đầu ra được tô màu qua một đường ống. Ví dụ:
$ ls -alh --color -CF ~/TESTDIR | cat -A
^[[0m^[[01;34m.^[[0m/ ^[[01;34m..^[[0m/ 1.txt 2.txt 3.txt out.txt$
Lưu ý cách .
và các ..
thư mục có trình tự thoát giống nhau.
Tất cả điều này có nghĩa là gì
Điều này có nghĩa là l
sẽ xuất ra danh sách các tệp màu theo loại tệp. Vấn đề là sự tô màu xảy ra với việc sử dụng các chuỗi thoát . Đó là những gì 1:34m
đang có - chúng là chuỗi thoát cho các màu cụ thể.
Vấn đề chính là phân tích cú pháp ls
thường dẫn đến đầu ra sai và thảm họa trong các tập lệnh, đơn giản là vì ls
cho phép các chuỗi thoát như được giải thích trước đó và các ký tự đặc biệt khác. Xem bài viết này để biết thêm: http://mywiki.wooledge.org/ParsingLs
Những gì bạn nên làm:
Sử dụng find
lệnh:
bash-4.3$ ls
1.txt 2.txt 3.txt out.txt
bash-4.3$ find . -maxdepth 1 -iname "*1*"
./1.txt
Bạn có thể làm một cái gì đó như thế này với [[
lệnh thử toàn cầu và hiện đại shell :
bash-4.3$ for file in * ;do if [[ "$file" =~ "1" ]] ;then echo "$file" ;fi ; done
1.txt
Hoặc có thể sử dụng python, có khả năng xử lý tên tệp tốt hơn nhiều so với bash
một mình
bash-4.3$ python -c 'import os;print [f for f in os.listdir(".") if "1" in f ]'
['1.txt']
Nếu không cần xử lý đầu ra ls
, quá trình tạo khối đơn giản ls
cũng có thể thực hiện công việc. (Hãy nhớ rằng, đây chỉ để xem danh sách các tệp, không phải để chuyển nó sang chương trình khác để xử lý văn bản đầu ra)
bash-4.3$ ls *1*
1.txt