sử dụng * trong tìm kiếm tập tin


9

Trong khi đọc về tìm kiếm tập tin linux tôi đã nhận được ...

Để tìm kiếm tệp bằng * ký tự đại diện, hãy thay thế chuỗi không xác định bằng *, ví dụ: nếu bạn chỉ nhớ rằng tiện ích mở rộng là .out, hãy nhập ls * .out

và khi tôi đã thử lệnh sau trên hệ thống (ubfox 14.04 LTS) .. Tôi đã nhận

anupam@JAZZ:~$ ls  *.bash* 

ls: cannot access  *.bash* : No such file or directory

anupam@JAZZ:~$ ls  .bash*

.bash_history   .bash_logout  .bash_profile  .bashrc

anupam@JAZZ:~$

trong trường hợp đầu tiên tại sao nó hiển thị Không có thư mục như vậy ( *.bash*) và trong trường hợp tiếp theo, nó hiển thị các tệp ( .bash*)

Tôi chưa quen với hương vị này, và theo các lớp lý thuyết automata của tôi (*) có nghĩa là bất kỳ sự kết hợp nào của chuỗi bao gồm epsilon (trống) ,, Vậy tại sao kết quả lại khác nhau trong cả hai trường hợp ....?

Câu trả lời:


11

Khi bạn làm ls *việc *đang được mở rộng trước khi nó được chuyển cho ls. Đó là để nói nếu chúng tôi có ba file ( a, bc) trong một thư mục ls *được thực sự chạy ls a b c.

Khi Bash không thể mở rộng, nó sẽ đi qua chuỗi thô¹. Đó là lý do tại sao bạn nhìn thấy các ký tự đại diện trong lỗi, cùng với một thông báo không tìm thấy. lsđã cố gắng hiển thị danh sách cho một tập tin được gọi theo nghĩa đen *.bash*.

Vậy tại sao không mở rộng? Theo mặc định, Globing (cái mà bản mở rộng ký tự đại diện này được gọi) sẽ không trả về các tệp ẩn. Bạn có thể thay đổi điều này với shopt -s dotglob(điều đó sẽ không tồn tại trừ khi bạn dán nó vào .bashrc- nó có thể bị tắt theo mặc định vì một lý do chính đáng vì vậy hãy cẩn thận với nó), đây là bản demo nhanh:

$ ls  *.bash*
ls: cannot access *.bash*: No such file or directory
$ shopt -s dotglob
$ ls  *.bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

Ngoại lệ cho điều này là các bạn đã hiển thị trên Wap khi bạn đã tuyên bố rõ ràng các tệp sẽ bị ẩn với một mẫu như thế nào .bash*. Nó chỉ đơn giản ghi đè dotglobcài đặt mặc định :

$ shopt -u dotglob  # unset dotglob
$ ls .bash*
.bash_aliases  .bash_history  .bash_logout  .bashrc  .bashrc.save

Dù sao, bên cạnh đó, tôi hy vọng điều này sẽ giúp bạn hiểu những gì đang diễn ra dưới bề mặt.


Có rất khác shoptcờ làm thay đổi cách globbing công trình: extglob, failglob, globstar, nocaseglobnullglob. Chúng và một loạt các shoptcờ khác được ghi lại như một phần của hướng dẫn Bash .

Tương tự, trang về Kết hợp mẫu sẽ giúp đọc tốt.

Trừ khi failglobhoặc nullglobđược đặt.


thanx @Oli ,, tôi đã không nhận được tất cả những điều đó như tôi đã đề cập Tôi mới biết về hương vị này ,, nhưng tôi đã nhận được 80% trong số đó ... Nó đã giúp tôi
lazarus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.