2008-10-11 22 views
14

Tôi là một người dùng dòng lệnh nặng và sử dụng lệnh find rộng rãi trong các kịch bản hệ thống xây dựng của tôi. Tuy nhiên trên Mac OS X khi tôi không tập trung, tôi thường nhận được kết quả như thế này:Làm cách nào để đặt lệnh "tìm" trên OS X mặc định cho thư mục hiện tại?

$ find -name \*.plist 
find: illegal option -- n 
find: illegal option -- a 
find: illegal option -- m 
find: illegal option -- e 
find: *.plist: No such file or directory 

Về cơ bản, tôi quên để thêm dấu chấm nhỏ:

$ find . -name \*.plist 

Bởi vì BSD find đòi hỏi đường dẫn và GNU find không (nó giả định thư mục hiện tại nếu bạn không chỉ định một thư mục). Tôi sử dụng Linux, Mac OS X và Cygwin thường xuyên cùng một lúc, vì vậy nó mang lại lợi ích to lớn cho tôi để có tất cả các công cụ của tôi hoạt động giống nhau. Tôi đã thử viết một hàm băm find đã thêm "./" nếu tôi quên, nhưng tôi đã thất bại. Cảm ơn bạn đã giúp đỡ. :)

Trả lời

10

Nếu bạn không thể rèn luyện bản thân để sử dụng find 'đúng', thì tại sao không cài đặt GNU find (từ findutils) trong một thư mục trên PATH của bạn trước khi hệ thống find lệnh.

Tôi đã từng sử dụng biến thể riêng của mình là cp để sao chép tệp vào thư mục hiện tại nếu mục cuối cùng trong danh sách không phải là thư mục. Tôi giữ nó trong thư mục cá nhân của tôi bin trong nhiều năm - nhưng cuối cùng đã xóa nó vì tôi không còn sử dụng chức năng này nữa. (My 'cp.sh' được viết vào năm 1987 và chỉnh sửa hai lần, vào năm 1990 và 1997, như là một phần của những thay đổi đối với ký hiệu hệ thống kiểm soát phiên bản. Tôi nghĩ rằng tôi đã xóa nó vào năm 1998. Vấn đề chính với kịch bản là cp file1 file2 là không rõ ràng giữa sao chép tệp qua tệp khác và sao chép hai tệp vào thư mục hiện tại.)

Xem xét văn bản wrapper của riêng bạn để find:

#!/bin/sh 
[ ! -d "$1" ] && set -- . "[email protected]" 
exec /usr/bin/find "[email protected]" 

Dòng thứ hai nói "nếu tranh luận 1 không phải là một thư mục, sau đó điều chỉnh các đối số dòng lệnh để bao gồm dấu chấm trước phần còn lại của lệnh. Điều đó sẽ gây nhầm lẫn nếu bạn đã bao giờ gõ:

~/bin/find /non-existent/directory -name '*.plist' -print 

vì thư mục không tồn tại không phải là một thư mục và kịch bản sẽ thêm dấu chấm vào dòng lệnh - các loại lý do mà tôi đã ngừng sử dụng cá nhân của tôi cp com mand.

+0

Tôi chấp nhận điều này vì nó phù hợp với nhu cầu của tôi nhất, cảm ơn rất nhiều. – mxcl

4
find ./ -name "*.plist" 

chỉnh sửa: hmm, tôi có thể đã hiểu lầm câu hỏi! nếu bạn bị điên, làm thế nào để mô phỏng nó thông qua một kịch bản shell? tôi thường xuyên giữ các tập lệnh tiện ích ngẫu nhiên trong ~/.bin, và đó là điều đầu tiên trong PATH của tôi. nếu bạn đã có một thiết lập tương tự có lẽ bạn có thể làm một cái gì đó như: (! chưa được kiểm tra)

#!/bin/sh 
# remapping find! 
CMD=`echo $1 | cut -c 1` 
if [ $CMD = '-' ] 
then 
# pwd search 
    /usr/bin/find ./ $* 
else 
# regular find 
    /usr/bin/find $* 
fi 
+0

Tuyệt vời :) Cảm ơn. Mặc dù không hoàn toàn hoàn hảo vì nó không xử lý: $ find nào nên được chuyển thành: $ find ./ – mxcl

1

Đây có lẽ không phải những gì bạn muốn nhưng làm thế nào về: alias find="find ."

hoặc chọn một tên mới (findl cho thấy địa phương ?)

+0

tôi sắp đề nghị một bí danh nhưng sau đó nhận ra rằng nó sẽ không làm việc để tốt nếu bạn * muốn * để chỉ định đường dẫn trên dòng lệnh tìm. –

+0

Nó sẽ tìm kiếm thư mục cục bộ AND đường dẫn bạn chỉ định. tìm không bị hạn chế đối với một đối số đường dẫn. – tzot

+0

Mặc dù nếu tôi chỉ định đường dẫn, có lẽ tôi cũng không muốn nó tìm kiếm thư mục hiện tại. – mxcl

2

Tôi khuyên bạn nên viết kịch bản (có nhiều khả năng được di chuyển từ hệ thống này sang hệ thống khác trong tương lai), bạn nên cố gắng sử dụng dạng cụ thể hơn của lệnh, nghĩa là chỉ định "." thay vì dựa vào mặc định. Vì lý do tương tự, tôi thậm chí có thể đề xuất viết sh tập lệnh thay vì dựa vào bash mà có thể không được cài đặt ở mọi nơi.

+0

Đây là một điểm tốt. Thực sự tôi nên thêm một kịch bản/chức năng trên các nền tảng khác mà bails ra lệnh find nếu tôi không chỉ định đường dẫn. Bằng cách đó tôi sẽ không bắt đầu viết các kịch bản có thể phá vỡ cho các triển khai khác nhau của các công cụ khác nhau. – mxcl

+0

Vì lý do này, tôi đã có thói quen sử dụng hành động "-print" ngay cả khi thấy rằng giả sử nó. – dmckee

6

Nếu bạn phải gọi nó là 'tìm', sau đó bạn muốn:

alias find=/usr/bin/find\ . 

trong .profile hoặc .bash_profile của bạn hoặc .... Thay thế đường dẫn thực (nếu không/usr/bin/find) trên Mac OSX của bạn. Nhập đường dẫn đầy đủ để tránh chu kỳ (bash bình thường sẽ giải thích alias find=find mà không có vấn đề, nhưng tốt hơn hãy chắc chắn).

Nhưng bạn không nên đặt tên bí danh find (findl, myfind v.v.), bởi vì nó sẽ trở thành thói quen và rắc rối cho bạn nếu bạn thử trên một hệ thống khác.

+0

Tôi thậm chí không bao giờ thử điều này vì tôi không nghĩ rằng tìm thấy có thể mất nhiều đường dẫn và do đó figured tôi sẽ không thể tìm kiếm đường dẫn khác hơn là hiện tại. Rất cám ơn :) – mxcl

+0

Thực ra điều này là không tốt. Vì nếu tôi chỉ định đường dẫn, tôi cũng không muốn bao gồm thư mục hiện tại. – mxcl

+0

Điều bạn đang nói là hiển nhiên. Lưu ý rằng không ai buộc bạn phải giả định "." làm mục tiêu mặc định cho tìm kiếm, ngoại trừ chính bạn (hãy kiểm tra câu hỏi của bạn!). – tzot

17

Cài đặt GNU tìm kiếm thay thế.

$ brew install findutils 
$ alias find=gfind 

Yay, nó hoạt động!

+0

Điều này sẽ lâu dài hơn: $ echo "alias find = 'gfind'" >> ~/.bash_profile – Brandon

+1

@Brandon: Chắc chắn, điều đó sẽ tùy thuộc vào người đọc để làm :) –

0

Bạn có thể muốn chạy các lệnh tìm thấy trong liên kết này: https://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools-in-mac-os-x/

Nó là một chút lỗi thời, ví dụ tôi thấy tôi không cần phải thêm có thể ra lệnh cho con đường của tôi cả.

Điều này bao gồm vấn đề của bạn bằng cách để hệ thống của bạn sử dụng tiện ích tìm kiếm không phải BSD từ gói findutils, đồng thời cũng cài đặt các công cụ khác mà bạn có thể muốn.

Các vấn đề liên quan