Làm cách nào để sử dụng lệnh của cat cat trên trên đầu ra của lệnh find Tìm kiếm?


13

Tôi muốn chuyển hướng đầu ra của findlệnh thành catlệnh để tôi có thể in dữ liệu của tệp đã cho.

Vì vậy, ví dụ nếu đầu ra của find là /aFile/readmethì con mèo nên được hiểu là cat ./aFile/readme. Làm thế nào tôi có thể làm điều đó ngay lập tức?

Tôi có phải sử dụng đường ống?

Tôi đã thử các phiên bản này:

cat | find ./inhere -size 1033c 2> /dev/null

Nhưng tôi đoán điều này là hoàn toàn sai? Tất nhiên tôi chắc chắn rằng đầu ra chỉ là một tệp chứ không phải nhiều tệp.

Vì vậy, làm thế nào tôi có thể làm điều đó? Tôi đã tìm kiếm trên Google và không thể tìm thấy giải pháp, có lẽ vì tôi đã không tìm kiếm đúng: P

Câu trả lời:


21

Bạn có thể làm điều này với findmột mình bằng cách sử dụng -exechành động:

find /location -size 1033c -exec cat {} +

{}sẽ được mở rộng thành các tệp được tìm thấy và +sẽ cho phép chúng tôi đọc càng nhiều đối số càng tốt cho mỗi lần gọi cat, vì mèo có thể nhận nhiều đối số.

Nếu bạn findkhông có +tiện ích mở rộng hoặc bạn muốn đọc từng tệp một:

find /location -size 1033c -exec cat {} \;

Nếu bạn muốn sử dụng bất kỳ tùy chọn nào cat, hãy:

find /location -size 1033c -exec cat -n {} +
find /location -size 1033c -exec cat -n {} \;

Ở đây tôi đang sử dụng -ntùy chọn để lấy số dòng.


Vì vậy, nếu tôi đúng: {} giống như một biến trong đó được lưu trữ đầu ra của lệnh find và sau dấu "+" bạn có nghĩa vụ phải viết các tham số con mèo không? Không Chỉnh sửa: Được rồi, bạn đã chỉnh sửa bài đăng của mình và bây giờ bạn vừa trả lời câu hỏi của tôi: P Thanx man! Đã giải quyết!
Eksapsy

@ general656 Kiểm tra các chỉnh sửa của tôi ..
heemayl

1
Thực tế là tôi không biết về lựa chọn catcủa mình -nlàm tôi ngạc nhiên. Tôi thích đọc những câu hỏi ngẫu nhiên.
mazunki

0

Bộ chỉ huy thay thế

Một lựa chọn khác là sử dụng Lệnh thay thế . Gói một lệnh trong $()sẽ chạy lệnh và thay thế lệnh bằng đầu ra của nó.

cat $(find ./inhere -size 1033c 2> /dev/null)

sẽ trở thành

cat ./inhere/file1 .inhere/file3

Điều này ít nhiều tương đương với việc sử dụng kiểu gói lệnh cũ hơn với dấu tick ngược:

cat `find ./inhere -size 1033c 2> /dev/null`

Thêm chi tiết từ các tài liệu được liên kết ở trên

Bash thực hiện việc mở rộng bằng cách thực thi lệnh trong môi trường lớp con và thay thế lệnh thay thế bằng đầu ra tiêu chuẩn của lệnh, với bất kỳ dòng mới nào bị xóa. Các dòng mới được nhúng không bị xóa, nhưng chúng có thể bị xóa trong quá trình tách từ. Việc thay thế lệnh $(cat file)có thể được thay thế bằng tương đương nhưng nhanh hơn $(< file).

Khi hình thức backquote kiểu cũ thay thế được sử dụng, xuyệc ngược vẫn giữ được nghĩa đen của nó, trừ khi sau đó $, `hoặc \. Backquote đầu tiên không có trước dấu gạch chéo ngược chấm dứt thay thế lệnh. Khi sử dụng $(command)biểu mẫu, tất cả các ký tự giữa các dấu ngoặc đơn tạo thành lệnh; không ai được điều trị đặc biệt

Thay thế lệnh có thể được lồng nhau. Để lồng khi sử dụng biểu mẫu backquote, thoát khỏi backquote bên trong với dấu gạch chéo ngược.

Nếu sự thay thế xuất hiện trong dấu ngoặc kép, việc tách từ và mở rộng tên tệp sẽ không được thực hiện trên kết quả.

Xem câu trả lời khác này cho một số ví dụ tốt về việc sử dụng.


Lưu ý rằng nếu findtìm thấy quá nhiều tệp, điều này sẽ tạo ra lỗi "danh sách đối số quá dài" khi cố gắng gọi cat. Nó cũng sẽ gặp vấn đề khi xử lý tên tệp có chứa các ký tự khoảng trắng và có thể cả tên tệp chứa các ký tự tên tập tin.
Kusalananda

-1

Điều này sẽ in tên và nội dung của tệp văn bản (ascii) chỉ đệ quy ..

find . -type f -exec grep -Iq . {} \; -print | xargs awk 'FNR==1{print FILENAME ":" $0; }'

Thêm một lần thử

find . -type f -exec grep -Iq . {} \; -printf "\n%p:" -exec cat {} \;

-2

Sử dụng đường ống và xargs

find /* -name pg_hba.conf | xargs cat

Nếu thất bại vì thiếu quyền, bạn có thể sử dụng sudo để đảm bảo rằng bạn có quyền thực thi lệnh find trên thư mục bạn đang tìm kiếm.

 sudo find /* -name pg_hba.conf | xargs sudo cat

1
Và nếu ai đó đã tạo một tệp có tên /tmp/ /dev/urandom /pg_hba.conf, điều đó sẽ cho phép root đổ toàn bộ nội dung của /dev/urandom. Tệ hơn có thể được thực hiện tùy thuộc vào bối cảnh. xargsnên hầu như không bao giờ được sử dụng mà không có -0nếu có. Cũng sudo xargssẽ tốt hơn xargs sudo. Và /*sẽ tốt hơn như /.
Stéphane Chazelas

1
OP muốn sử dụng cat để in nội dung tệp trên thiết bị xuất chuẩn. Vì vậy, mục đích được phục vụ bởi con mèo. Câu hỏi là làm thế nào để sử dụng cat từ lệnh out put of find để in nội dung của tệp chứ không phải cách sử dụng sudo hoặc find, Lệnh trên giải quyết câu hỏi. Có xargs -0 là điều duy nhất mang tính xây dựng mà bạn đã chỉ ra. Nhưng không cho thấy việc sử dụng. Cố gắng đừng thô lỗ.
Ứng dụng hoạt động

Xin lỗi nếu điều đó xuất hiện thô lỗ. Đó không phải là ý định. Tôi muốn chỉ ra những hạn chế. Câu trả lời của bạn cho thấy các thực tiễn xấu ( find|xargskhông -0thực sự nên bị cấm), do đó bỏ phiếu xuống. Đầu ra của findkhông -print0có không thể xử lý sau đáng tin cậy. -print0không chuẩn Như đã nói, tiêu chuẩn sudo find / -name pg_hba.conf -exec cat {} +cũng có thể khiến bạn bỏ nội dung của /dev/urandom(ví dụ nếu ai đó tạo liên kết tượng trưng từ /tmp/pg_hba.confđó và không có cách di động dễ dàng nào xung quanh mà ít nhất không có điều kiện cuộc đua).
Stéphane Chazelas

1
Chúng ta không sử dụng sudo"chỉ trong trường hợp", phải không?
lindhe

Chà, tốt hơn là chạysudo rm -rf /
devinbost
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.