Tại sao không tìm thấy ** tìm thấy gì?


17

Tôi đang tìm cho các tập tin kịch bản shell được cài đặt trên hệ thống của tôi, nhưng tìm không hoạt động:

$ find /usr -name *.sh 

Nhưng tôi biết có một tấn kịch bản ra khỏi đó. Ví dụ:

$ ls /usr/local/lib/*.sh 
/usr/local/lib/tclConfig.sh 
/usr/local/lib/tkConfig.sh 

Tại sao không tìm làm việc?

+2

Đây có phải là câu hỏi một superuser ? 08 nov. 092009-11-08 01:44:11

  0

Điều này phù hợp hơn với [UnixSE] (http://unix.stackexchange.com/) 17 dec. 152015-12-17 10:17:21

51

Hãy thử trích dẫn wildcard:

$ find /usr -name \*.sh 

hay:

$ find /usr -name '*.sh' 

Nếu bạn tình cờ có một tập tin phù hợp * sh trong thư mục làm việc hiện tại, các ký tự đại diện sẽ được mở rộng trước khi tìm thấy nó. Nếu bạn tình cờ có một file có tên tkConfig.sh trong thư mục làm việc của bạn, tìm lệnh sẽ mở rộng tới:

$ find /usr -name tkConfig.sh 

mà sẽ chỉ tìm thấy tập tin có tên tkConfig.sh. Nếu bạn có nhiều hơn một tập tin phù hợp * sh, bạn sẽ nhận được một lỗi cú pháp từ tìm:

$ cd /usr/local/lib 
$ find /usr -name *.sh 
find: bad option tkConfig.sh 
find: path-list predicate-list 

Một lần nữa, lý do là các ký tự đại diện mở rộng cho cả hai tập tin:

$ find /usr -name tclConfig.sh tkConfig.sh 

Bỏ qua ký tự đại diện ngăn không cho thẻ mở rộng sớm.

Một khả năng khác là/usr hoặc một trong các thư mục con của nó là một liên kết tượng trưng. tìm thường không theo các liên kết, vì vậy bạn có thể cần -follow tùy chọn:

$ find /usr -follow -name '*.sh' 
  0

Điều gì xảy ra nếu tệp đó là tập lệnh shell nhưng thiếu phần mở rộng '.sh'? Có lẽ một cái gì đó như 'find/xyz | tệp xargs | grep shell'? 14 dec. 152015-12-14 17:52:12

  0

Mức độ thường xuyên, tuy nhiên, làm các tập lệnh shell ** không ** có phần mở rộng .sh? 16 dec. 152015-12-16 19:43:46

  0

Có cách nào chung để tìm ra khi nào/nơi một ký tự đại diện đang được mở rộng? 21 dec. 152015-12-21 09:51:50

  0

Vâng, lớn lên trong cửa sổ nơi * mọi thứ * có phần mở rộng Tôi đã nhìn thấy khá nhiều kịch bản trên * ix bỏ qua đó '.sh' 21 dec. 152015-12-21 19:29:00


15

Trên một số hệ thống (Solaris, ví dụ), không có hành động mặc định, vì vậy bạn cần phải thêm - lệnh in.

find /usr -name '*.foo' -print 
+1

Tôi đã từng chút một trong quá khứ. Nhưng tôi nên chỉ ra rằng trên một hộp Solaris hiện đại, dấu vân tay được bật theo mặc định. Trong thực tế, tôi dường như không thể tìm thấy một tìm thấy mà không làm việc theo cách đó nữa. 08 sep. 082008-09-08 22:49:33


7

Đối với việc tìm kiếm các tập tin trên đĩa của bạn, nạc để sử dụng "định vị" thay vào đó là tức thời (trông vào một chỉ số được xây dựng hàng ngày) bạn ví dụ sẽ là:

locate '/usr*.sh' 
  0

Một đề xuất tốt. (Tôi đã phải chạy updateb trên máy tính của tôi để kiểm tra ý tưởng, vì tôi không có nó trong crontab của tôi vì lý do nào đó. Không có cơ sở dữ liệu cập nhật sẽ là lý do chính để không sử dụng định vị.) 27 jan. 092009-01-27 18:39:51

  0

Và có một vài hệ thống không được định vị được cài đặt theo mặc định - Tôi thấy rằng tôi phải cài đặt gói 'mlocate' trên Raspberry Pi của tôi - không quên' sudo updatedb' sau đó để xây dựng các chỉ mục ... 24 dec. 152015-12-24 22:33:51