Hiển thị nội dung của nhiều tệp


19

Từ dòng lệnh, cách dễ nhất để hiển thị nội dung của nhiều tệp là gì? Thư mục của tôi trông như dưới đây.

./WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b
./xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM
./GZnATXO1e5Hh3Bz1bhgJjjwheIjjZqtnXR0hfOyj
./mWz7ehBNoTZmtDh8JG6sxw2lMJFwIovPzxDGECUY
./JN65F5v3RL2ilHPqNSx9N9D4lvVpqpbJ9lASd8TJ
./At9PS4y4nTiXUO0Z0USnbYkTPBla1msQRpwuruqE
./YiPyMZPCaUDZTiTczAvWII9bJrUqLXCFtH2pXEA2
./JoakdlbRFPwAvWp1d4n8RvMoyMeizCoiriL2Sn2U
./wFPWZUus8Yu7UtESGABLCoqDg36cT90USO0xuyUr
./qseI9PgV1EJfZCDyGGeVytajqG7JeX0r7eA5S1JW
./zgFJpNgXyCsaVh38aCuMGuzHwIbwSNB6rQDdh27x
./.htaccess

Bây giờ tôi muốn xem nội dung của tất cả các tệp ngoại trừ .htaccess. Nó có thể trông giống như:

WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b:
Contents of file WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b.

xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM:
Contents of file xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM.

[...]

Tôi nghĩ điều này có thể thực hiện được với sự kết hợp giữa find, xargs và cat, nhưng tôi chưa tìm ra cách. Cảm ơn vì đã dành thời gian cho tôi!


Câu trả lời:


30

Hai lệnh tiêu chuẩn headtailin một tiêu đề với tên tệp nếu bạn truyền cho chúng nhiều hơn một đối số tệp. Để in toàn bộ tập tin, sử dụng tail -n +1(in từ dòng đầu tiên trở đi, tức là mọi thứ).

Ở đây, có vẻ như bạn muốn xem mọi tệp ngoại trừ tệp duy nhất có tên bắt đầu bằng dấu chấm. Các tệp chấm là các ẩn được ẩn trong unix: chúng không xuất hiện trong đầu ra mặc định của lshoặc trong một trận đấu ký tự đại diện. Vì vậy, việc khớp tất cả các tệp không bị ẩn được thực hiện chỉ với *.

tail -n +1 *

(Nói đúng ra, tail -n +1 -- *là cần thiết trong trường hợp một trong các tên tệp bắt đầu bằng a -.)


Ngắn gọn và ngọt ngào, cảm ơn bạn! Bạn có biết nơi tôi có thể đọc về --sửa đổi?
Znarkus

2
@Znarkus: --để biểu thị sự kết thúc của các tùy chọn là một quy ước mà hầu hết các lệnh tuân theo. Ví dụ, tail -n +1 -- -f -gnói tailrằng -f-glà các tệp để đọc (toán hạng) và không phải là tùy chọn. Đó là hướng dẫn 10 trong hướng dẫn cú pháp tiện ích POSIX (tài liệu dành cho người viết tiện ích). Tôi không có đề xuất đọc dành cho người dùng cuối, tôi mong đợi một hướng dẫn unix tốt để bao quát nó vào một lúc nào đó.
Gilles 'SO- ngừng trở nên xấu xa'

Chỉ cần một nhận xét, vì nhiều câu trả lời khác đề nghị sử dụng find, nhưng sau đó sử dụng một số exec với định dạng in: Một cách đơn giản để sử dụng findtaillà: find . -type f -print0 -name "*" | xargs -0 tail -n +1 -- ( -print0xargs -0--đảm bảo rằng các lệnh cũng làm việc với các tên tập tin với không gian hoặc bắt đầu với -)
IanH

14

Bạn có thể làm tất cả trong một với find:

$ find . -type f -not -name .htaccess -printf "\n%p\n" -exec cat {} \;

Điều đó cho biết findđể tìm tất cả các tệp ( -type f) trong thư mục hiện tại ( .) ngoại trừ ( -not) một tên có tên .htaccess( -name .htaccess). Sau đó, nó in ( -printf) một dòng mới theo sau là tên tệp ( %p), rồi chạy cattrên tệp ( -exec cat {} \;). Điều đó sẽ cung cấp cho bạn đầu ra như:

test/test3
Line 1

test/test2
Line 1

test/test1
Line 1
Line 2
Line 3

Nếu bạn làm điều này thường xuyên, nó có thể đáng để gắn nó vào một tập lệnh shell hoặc một hàm; Tôi có một cái tên được catslàm chính xác điều đó:

#!/bin/bash
for filename; do
    echo "\033[32;1m$filename\033[0m"
    cat "$filename"
    echo
done

Nó lặp qua từng đối số tên tệp, in ra tên tệp (màu xanh đậm) và sau đó chọn tệp:

Ảnh chụp màn hình ví dụ

Vì vậy, lệnh sẽ chỉ là:

$ find . -type f -not -name .htaccess -exec cats {} \+

Cái kia ngắn hơn, nên chấp nhận điều đó. Câu trả lời tuyệt vời, cảm ơn bạn!
Znarkus

6

Để hiển thị nội dung của tất cả các tệp trong thư mục hiện tại, hãy thử:

grep -vI "\x00" -- *

và tương tự, nhưng đệ quy:

grep -vIr "\x00" -- .

Các định dạng sẽ là : filename: content.

Để có định dạng tương tự như đề xuất, nó sẽ là:

grep -rvl "\x00" -- * | while read file; do printf "\n\n#### $file ####\n"; cat $file; done

Ghi chú bên:

  • Sử dụng NUL ( \x00) trong các ví dụ trên sẽ ngăn hiển thị các tệp nhị phân ( -Ithực tế đang làm, nhưng chúng tôi vẫn sử dụng một số mẫu).
  • Sử dụng ký tự đại diện ( *), nó tự động bỏ qua các tệp ẩn như .htaccess.

Xem thêm: grep: hiển thị tên tệp một lần, sau đó hiển thị ngữ cảnh với số dòng tại Unix SE


2
Thông thường grep -r ^là đủ.
catpnosis

2

Bạn có thể sử dụng điều này:

cat $(find Directory/ -not -name *.htaccess)

1

Nếu bạn muốn tinh chỉnh và không mất quá nhiều thời gian với các đường ống, hãy tìm và mọi thứ (hoàn toàn là công cụ mạnh nhất mà bạn có thể tìm thấy)

chỉ cần cố gắng sử dụng một vòng lặp for, cat, v.v.


0

Nếu bạn muốn in quá, hãy sử dụng đệ quy (ví dụ: đối với các tệp có phần mở rộng .sql):

find -name "*.sql" -exec cat {} \; > all.sql
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.