Đây là một phiên bản đơn giản với giải thích mở rộng cho những người mới bắt đầu như tôi, những người đang cố gắng học cách đặt nhiều lệnh trong một dòng.
Nếu bạn viết ra vấn đề theo từng bước, nó sẽ giống như sau:
// For every file in this directory
// Check the filetype
// If it's an ASCII file, then print out the filename
Để đạt được điều này, chúng ta có thể sử dụng ba lệnh UNIX: find
, file
, và grep
.
find
sẽ kiểm tra mọi tệp trong thư mục.
file
sẽ cung cấp cho chúng tôi loại tệp. Trong trường hợp của chúng tôi, chúng tôi đang tìm kiếm sự trả lại của 'văn bản ASCII'
grep
sẽ tìm kiếm từ khóa 'ASCII' trong đầu ra từ file
Vậy làm thế nào chúng ta có thể xâu chuỗi chúng lại với nhau trong một dòng? Có nhiều cách để làm điều đó, nhưng tôi thấy rằng làm điều đó theo thứ tự mã giả của chúng tôi có ý nghĩa nhất (đặc biệt là đối với một người mới bắt đầu như tôi).
find ./ -exec file {} ";" | grep 'ASCII'
Trông phức tạp, nhưng không tệ khi chúng ta chia nhỏ nó ra:
find ./
= xem qua mọi tệp trong thư mục này. Các find
lệnh in ra tên tập tin của bất kỳ tập tin phù hợp với 'biểu hiện', hoặc bất cứ điều gì xảy ra sau khi con đường, mà trong trường hợp của chúng tôi là thư mục hiện tại hoặc./
Điều quan trọng nhất cần hiểu là mọi thứ sau bit đầu tiên đó sẽ được đánh giá là Đúng hoặc Sai. Nếu Đúng, tên tệp sẽ được in ra. Nếu không, thì lệnh sẽ tiếp tục.
-exec
= cờ này là một tùy chọn trong lệnh find cho phép chúng ta sử dụng kết quả của một số lệnh khác làm biểu thức tìm kiếm. Nó giống như gọi một hàm trong một hàm.
file {}
= lệnh được gọi bên trong của find
. Các file
lệnh trả về một chuỗi cho bạn biết filetype của một tập tin. Thường xuyên, nó sẽ trông như thế này: file mytextfile.txt
. Trong trường hợp của chúng tôi, chúng tôi muốn nó sử dụng bất kỳ tệp nào đang được lệnh xem xét find
, vì vậy chúng tôi đặt vào dấu ngoặc nhọn {}
để hoạt động như một biến trống hoặc tham số. Nói cách khác, chúng tôi chỉ yêu cầu hệ thống xuất một chuỗi cho mọi tệp trong thư mục.
";"
= cái này được yêu cầu bởi find
và là dấu chấm câu ở cuối -exec
lệnh của chúng ta . Xem hướng dẫn về 'tìm' để biết thêm giải thích nếu bạn cần bằng cách chạy man find
.
| grep 'ASCII'
= |
là một cái ống. Pipe lấy đầu ra của bất kỳ thứ gì ở bên trái và sử dụng nó làm đầu vào cho bất kỳ thứ gì ở bên phải. Nó lấy đầu ra của find
lệnh (một chuỗi là kiểu tệp của một tệp duy nhất) và kiểm tra nó để xem nó có chứa chuỗi hay không 'ASCII'
. Nếu đúng, nó trả về true.
NOW, biểu thức ở bên phải của find ./
sẽ trả về true khi grep
lệnh trả về true. Thì đấy.
find . -type f -exec grep -Il "" {} \;
.