tập tin mèo với thư mục


10

Có một lệnh để hiển thị tên thư mục / tập tin khi tập tin mèo?

Ví dụ: giả sử hai tệp F1.txt và f2.txt nằm dưới ./tmp

./tmp/f1.txt
./tmp/f2.txt 

Sau đó, khi tôi làm cat ./tmp/*.txt , chỉ nội dung của các tệp sẽ được hiển thị. Nhưng làm thế nào để trước tiên hiển thị tên tệp, sau đó là nội dung?, Ví dụ:

 (The needed command):
 ./tmp/f1.txt:  
 This is from f1.txt
 and so on
 ./tmp/f1.txt:
 This is from f2.txt ...

Có một lệnh để làm điều đó? (Dường như không có tùy chọn nào cho 'cat' để hiển thị tên tệp)


Câu trả lời:


6
$ for file in ./tmp/*.txt; do echo "$file";  cat "$file"; done

-hoặc là-

$ find ./tmp -maxdepth 1 -name "*.txt" -print -exec cat "{}" \;

3
Ví dụ đầu tiên sẽ ngắt trên các tệp có khoảng trắng. Bạn không bao giờ nên cố gắng phân tích hoặc lặp lại trên đầu ra của ls: mywiki.wooledge.org/ParsingLs
jordanm

17

Cũng như một ý tưởng khác, hãy thử tail -n +1 ./tmp/*.txt

==> file1.txt <==
<contents of file1.txt>

==> file2.txt <==
<contents of file2.txt>

==> file3.txt <==
<contents of file3.txt>

2

Bạn có thể dễ dàng viết một kịch bản nhỏ làm điều đó,

for f in "$@" do; echo "This is from $f"; cat -- "$f"; done

Cảm ơn, nhưng có cách nào để tránh sử dụng tập lệnh - bằng cách sử dụng lệnh?

Theo hiểu biết của tôi, không có một lệnh như vậy

1
Sự khác biệt thực tế giữa tập lệnh và lệnh, hoặc tại sao việc nhập nhiều lệnh trên một dòng lệnh để giải quyết vấn đề là gì? Lệnh không phải ở trong một tệp. Bạn có thể chạy "tập lệnh" bằng cách chỉ cần gõ vào văn bản đã cho.

Đó là sự thật - nhưng tôi muốn sử dụng một cái gì đó đã tồn tại, vui lòng xem câu trả lời từ "ire_and_curses" và "kbulgrien"

3
Vui lòng sử dụng "$@"thay vì $*, trước đây sẽ xử lý tên tệp có dấu cách (đây là một phần của vỏ POSIX, đây không phải là bash-ism). Ngoài ra, cat "$f".
derobert

1
find . -name '*' -execdir cat '{}' \;

Khi một thư mục được chuyển đến cat, bạn sẽ thấy một cái gì đó như:

cat: ./chapter_01: Is a directory

Ngay sau đó, findsẽ catnội dung của thư mục đó.


1

Không chính xác những gì bạn yêu cầu, nhưng bạn có thể tiền tố mỗi dòng với tên tệp:

$ grep ^ ./tmp/*.txt
./tmp/f1.txt: this is from f1.txt
./tmp/f1.txt: blaa, blaa, blaa...
./tmp/f1.txt: blaa, blaa, blaa...
./tmp/f2.txt: this is from f2.txt
./tmp/f2.txt: blaa, blaa, blaa...
./tmp/f2.txt: blaa, blaa, blaa...

Sẽ rất khó để làm tốt hơn thế này mà không cần dùng đến một chút kịch bản.


1
Đó là một cách giải quyết tốt - các tệp của tôi thực sự là một dòng.

1

cat (cố ý) là một lệnh cực kỳ đơn giản chỉ cần đọc một luồng tệp và chuyển nó sang một luồng khác (với một vài tùy chọn định dạng cơ bản). Thật dễ dàng để tạo một tiện ích dựa trên con mèo đã cung cấp tên tệp, nhưng các phiên bản tiêu chuẩn sẽ không làm điều này - có lẽ vì nó dễ dàng sao chép bằng các lệnh khác.

Nếu bạn muốn kiểm tra các trang theo cách thủ công, bạn có thể sử dụng 'ít hơn'. Điều này sẽ cung cấp cho bạn tên tệp ở cuối mỗi tệp, ở định dạng: 'foo.txt (tệp 1 trên 100) (END) - Tiếp theo: bar.txt).


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.