Làm thế nào để tôi thành thạo lệnh tìm UNIX?


11

Tôi nghĩ rằng tôi khá tiên tiến trong việc sử dụng tìm kiếm nhưng MỌI lần tôi sử dụng nó, tôi không thể nhớ được phương pháp này để đóng tùy chọn -exec. Tôi dành rất nhiều thời gian để đọc mỗi khi tôi sử dụng nó. Tôi chỉ đơn giản là không sử dụng nó đủ hoặc mong đợi quá nhiều của bản thân? Hãy bắt đầu với một ví dụ điển hình khiến tôi thất vọng.

Cấu trúc thư mục có các tệp với tất cả các quyền không chính xác ẩn các tệp liên kết tượng trưng, ​​v.v. Tôi muốn thay đổi quyền sở hữu thành giá trị hợp lý

find . -type f -exec chown username {} \;
find . -type d -exec chown username {} \;
find . -type d -exec chgrp usergroup {} \;
find . -type f -exec chgrp usergroup {} \;

(Hãy tha thứ cho tôi nếu kết thúc ngược ... Tôi đã xem nó một giờ trước và tôi vẫn không chắc chắn)

Nhưng tôi sợ phải chạy nó vì thú cưỡi, liên kết tượng trưng, ​​v.v. Tôi đã tạo ra sự ngu ngốc cuối cùng của chmod. * Và nó đã tái diễn trước tôi. Tôi biết -xdev sẽ từ bỏ các phân vùng nhưng tôi không chắc điều gì sẽ xảy ra với các tệp nằm trong các thư mục có liên kết tượng trưng.

Vậy làm thế nào để một người làm chủ con thú này có thể giết các tập tin quan trọng?

Cập nhật cắt tỉa những gợi ý tốt nhất dưới đây và tóm tắt:

  1. Có một thư mục thực hành được liên kết và gắn kết với các thư mục thực hành khác.
  2. Sử dụng xargs chứ không phải lệnh exec không trực quan.
  3. Sử dụng -exec echo {} cho sự tỉnh táo và an toàn
  4. Semi dấu hai chấm là đặc biệt và bạn đang thoát nó do đó char thoát là đầu tiên
  5. Lệnh -or có thể giúp bạn kết hợp các tiêu chí lựa chọn.

Tôi hơi bối rối về print0 nhưng xargs luôn có một chút không dễ hiểu ngay từ cái nhìn đầu tiên mà tôi cố gắng tránh.


1
Tôi cũng không thể nhớ nó, vì vậy tôi chỉ đưa nó vào xargs.
bộ cộng hưởng

2
Khi bạn hài lòng với việc xây dựng lệnh đúng, hãy xem xét chạy nó bằng + thay vì \; Nó sẽ chạy nhanh hơn với + vì lệnh exec sẽ được gọi ít thường xuyên hơn.
wzzrd

wzzrd, mẹo tuyệt vời về việc sử dụng + thay vì \;
Daniel Lawson

Câu trả lời:


19

Vâng, theo như -execcú pháp, bạn có thể làm như nhiều người, từ bỏ và sử dụng xargs:

find . -type f | xargs chown username

(hoặc các tệp có không gian-và-phiên bản khác vô nghĩa trong an toàn)

find . -type f -print0 | xargs -0 chown username

Hoặc, để cố nhớ điều đúng với dấu chấm phẩy, điều bạn cần khoan vào đầu là bạn đang sử dụng dấu chấm phẩy để chấm dứt lệnh -execđang chạy và bạn phải thoát dấu chấm phẩy vì nó có dấu hiệu đặc biệt ý nghĩa cho bash. Đó là lý do tại sao nó gạch chéo dấu chấm phẩy. Bạn dường như có phần {}thay thế được.

Để giết các tập tin, v.v., nếu bạn đang chạy thứ gì đó lớn và nguy hiểm như bạn đang nói, trước tiên hãy làm điều này:

find . -type f -exec echo chown username {} \;

và xem xét kết quả. Về cơ bản, đây là "chạy khô" trong đó bạn đang thấy các lệnh nó sẽ chạy nếu bạn để nó. Chắc chắn là một thực hành tốt. Sẽ không giúp đỡ với .*vấn đề, nhưng bạn biết không làm điều đó ngay bây giờ. :)


1
+! cho 'tiếng vang' thực hành chạy khô. Tôi luôn sử dụng điều này cho một sự thay đổi lớn
Steve Folly

3

Tôi ngạc nhiên chưa ai đề cập đến tùy chọn sau:

find . -type f -ok chown username {} \;

Cú pháp này sẽ xác nhận lệnh trước khi thực hiện nó. Nó hoạt động tốt nhất nếu bạn mong đợi trận đấu của mình có số lượng tệp tương đối nhỏ vì nó sẽ nhắc cho từng tệp.

Một số câu trả lời đề cập xargs, nhưng với GNU thấy rằng điều đó là không cần thiết:

find . -type f -exec chown username {} \+

Lưu ý rằng + thường không cần phải thoát, nhưng thật tốt để có thói quen làm như vậy.


Bạn có thể giải thích bản chất của dấu cộng ... chính xác là nó đang làm gì không? Là shell xử lý nó hoặc lệnh. Tôi nghĩ rằng tôi sẽ tải xuống mã nguồn cho gnu-find vì đây là một chủ đề thú vị.
ojblass

tìm là xử lý nó. Đọc người đàn ông tìm để tìm hiểu thêm về tùy chọn đó.
Kamil Kisiel

3

Đây là những gì con người dành cho: Có thể khó nhớ mọi thứ, đó là lý do tại sao lệnh * nix bao gồm các trang man. Bạn luôn có thể kiểm tra phần HÀNH ĐỘNG của trang man để biết lời nhắc về cú pháp : man find. Mặc dù các trang dành cho nam giới có vẻ không thân thiện, nhưng một khi bạn đọc được chúng, chúng rất tiện dụng.

Tạo Front-End hoặc Wrapper: Khi tôi muốn cải thiện GNU, tôi đã viết giao diện người dùng GUI để tìm các lệnh tìm kiếm với python, glade và pygtk. Đây là một bài tập tốt nếu muốn làm quen với nó thực sự tốt.

Có một Thư mục thực hành: Cuối cùng, tôi luôn có một thư mục 'phế liệu' trong thư mục nhà của mình để chơi với các lệnh mạnh mẽ khi một cái gì đó như 'echo' không cắt được. Bạn có thể sử dụng mở rộng shell để nhanh chóng tạo ra một loạt các tệp với nội dung như:

for i in {1..100}; do touch "$i"; done

Lạ một thư mục thực hành là điều tôi chưa bao giờ xem xét.
ojblass

1

Bạn cũng có thể kết hợp tìm biểu thức với toán tử '-và' và '-hoặc'. -Và là ẩn:

find . -type f -name "plainfile" ...

giống như

find . -type f -and -name "plainfile" ...

Toán tử hoặc có thể giảm danh sách 4 lệnh của bạn xuống 2:

find . -type d -or -type f ...

Và cuối cùng, không liên quan để tìm, nhưng chown cũng có thể thiết lập nhóm là tốt. Vì vậy, đối phó với khoảng trắng trong tên cũng như chúng ta kết thúc với:

find . -type d -or -type f -exec chown username:usergroup '{}' \;

Những gì tìm thấy với các doanh nghiệp -or. [Sic]
ojblass

@ojblass: tìm kết hợp các biểu thức bằng cách sử dụng 'và' hoặc 'hoặc', theo mặc định nếu không '-and' hay '-or' được chỉ định, '-and' được sử dụng hoàn toàn. Vì vậy, gõ 'find -type d -type f' sẽ không tìm thấy gì vì không có gì là thư mục tệp.
Steve Folly

0

Khi đóng cửa tôi chỉ nghĩ đến việc sử dụng; giống như với nhiều ngôn ngữ lập trình và sau đó thoát khỏi nó. Chỉ cần nhớ rằng cần phải được trốn thoát và nó đến với bạn khá dễ dàng.


0

Tùy thuộc vào phiên bản tìm thấy mà bạn đang sử dụng, có các tùy chọn khác nhau có thể giúp bạn. GNU find có lẽ là mạnh nhất và điều này có thể giúp bạn với câu hỏi thứ hai (ngụ ý)

Chẳng hạn - hành vi mặc định không phải là liên kết tượng trưng, ​​nhưng bạn có thể ghi đè lên đó; và tùy chọn -mount dừng tìm thấy đi qua các điểm gắn kết

Nhìn vào trang người đàn ông địa phương của bạn


0

Một số người sẽ cho rằng tùy chọn xargs nhanh hơn tùy chọn -exec bởi vì nó sẽ không thực thi lệnh một lần cho mỗi tệp, nhưng tôi sẽ không lo lắng về điều đó cho bất cứ điều gì ngoại trừ những công việc khổng lồ chiếm một lượng thời gian không hề nhỏ.

Cá nhân, tôi thường chỉ chạy find mà không thực hiện

find /path/to/dir -name whatever

đảm bảo rằng đầu ra trông chính xác, và sau đó chạy lệnh của tôi trong danh sách đó.

chown user:group `find /path/to/dir -name whatever`

Ví dụ hoàn hảo về cách "không" làm việc. Tên tập tin với không gian.
Ian Kelling

Đúng, đó là một vấn đề tiềm năng mà có lẽ tôi phải thừa nhận. Tuy nhiên, quan điểm của tôi là về việc đọc kết quả tìm kiếm trước khi thực hiện bất cứ điều gì, trong đó bạn sẽ phát hiện ra khoảng trắng hoặc sự điên rồ của tên tệp khác.
thứ

0

Đối với một số shell (không phải bash) thoát {} cho hành vi đúng.

\{\} or '{}'

tìm hướng dẫn là tốt để làm chủ tìm.


Không, bạn không có; tìm thấy chạy tốt với {} như họ đang có. Chúng là một phần của lệnh find: chúng là mã thông báo được thay thế bằng kết quả của lệnh find. Chúng chỉ có nghĩa là một cái gì đó trong bash khi xác định hàm hoặc gọi các biến, vì vậy bạn chỉ có thể sử dụng chúng như trong câu hỏi ban đầu.
wzzrd

Nó từ trang người đàn ông. Tôi cập nhật để nói rằng nó không áp dụng cho bash.
Ian Kelling

0

Trước khi bạn làm bất cứ điều gì như thế này, hãy đảm bảo thư mục chạy lệnh này không nằm trong cùng hệ thống tệp với / usr hoặc / etc. .

Nếu bạn muốn lặp lại qua một thư mục và chọn tất cả các tệp / thư mục, một cách đơn giản

chown -Rh user: usergroup user /

sẽ làm điều đó. Hãy chắc chắn rằng bạn sử dụng -h hoặc chown sẽ theo các liên kết tượng trưng.


Tôi không nghĩ rằng đây là nền tảng chéo. Cũng thất bại với 247K tệp như được chứng minh bởi môi trường thực hành của tôi. Tôi không chắc tại sao.
ojblass

Tôi nghĩ rằng bạn đã tìm thấy một lỗi nhiều hơn bạn đã tìm thấy một vấn đề đa nền tảng. Phiên bản nào và trạng thái thoát khi bị lỗi? Theo như tôi có thể nói trước tiên nó bắt nguồn từ các phiên bản bsd đầu tiên; nó chắc chắn trong sunos 5.3 và ultrix và irix. Có bao nhiêu nó xử lý trước khi nó thất bại?
chris

Bạn đúng, nó hoạt động trên AIX 5.3, AIX 5.2, nhưng không phải AIX 4.3, NCR, HP 11, HP 10.20 hoặc các bản phân phối DSL của tôi. IN tất cả các trường hợp dường như không thành công tại hoặc gần 60k tệp.
ojblass
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.