ก่อนอื่นสิ่งที่คุณกำลังพยายามทำl| grep <filename>
อยู่นั้นไม่ดี อย่าทำมัน นี่คือเหตุผล
l
คำสั่งเป็นนามแฝงจริงๆ ls -CF
$ type -a l
l is aliased to `ls -CF'
โดยเริ่มต้นในของ Ubuntu bash
, เป็นนามแฝงที่จะls
ls --color=auto
ในฐานะที่เป็นผู้ขับรถเหล็กชี้ให้เห็นในความคิดเห็นที่--color=auto
ควรจะปิด colorization ในกรณีที่เฉพาะเจาะจงของคุณคุณมีalias ls="ls -alh --color"
และซึ่งโดยทั่วไปสิ้นสุดขึ้นเป็นalias l="ls -CF"
ls -alh --color -CF
การรวมกันโดยเฉพาะอย่างยิ่งของสวิทช์ยังคงส่งออก colorized ผ่านท่อ ตัวอย่างเช่น:
$ ls -alh --color -CF ~/TESTDIR | cat -A
^[[0m^[[01;34m.^[[0m/ ^[[01;34m..^[[0m/ 1.txt 2.txt 3.txt out.txt$
ขอให้สังเกตว่า.
และ..
ไดเรกทอรีมีลำดับการหลีกเลี่ยงเดียวกัน
ทั้งหมดนี้หมายความว่าอย่างไร
ซึ่งหมายความว่าl
จะแสดงรายการไฟล์ที่เป็นสีตามประเภทไฟล์ ปัญหาคือว่า colorization ที่เกิดขึ้นกับการใช้งานของลำดับหนี นั่นคือสิ่ง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
คุณสามารถทำสิ่งนี้กับเชลล์ glob และ[[
คำสั่งการทดสอบที่ทันสมัย:
bash-4.3$ for file in * ;do if [[ "$file" =~ "1" ]] ;then echo "$file" ;fi ; done
1.txt
หรืออาจใช้ python ซึ่งมีความสามารถในการจัดการชื่อไฟล์ได้ดีกว่าbash
คนเดียว
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