Tampilkan konten banyak file

19

Dari baris perintah, apa cara termudah untuk menunjukkan isi beberapa file? Direktori saya terlihat seperti di bawah ini.

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

Sekarang saya ingin melihat isi semua file kecuali .htaccess. Itu mungkin terlihat seperti:

WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b:
Contents of file WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b.

xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM:
Contents of file xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM.

[...]

Saya pikir ini bisa dilakukan dengan kombinasi find, xargs dan cat, tapi saya belum menemukan caranya. Terima kasih atas waktunya!

Znarkus
sumber
stackoverflow.com/questions/5917413/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

30

Dua perintah standar headdan tailcetak header dengan nama file jika Anda memberikan lebih dari satu argumen file. Untuk mencetak seluruh file, gunakan tail -n +1(cetak dari baris pertama dan seterusnya, semuanya).

Di sini, sepertinya Anda ingin melihat setiap file kecuali satu file yang namanya dimulai dengan titik. File dot "tersembunyi" di bawah unix: mereka tidak muncul dalam output default lsatau dalam pertandingan wildcard. Jadi mencocokkan setiap file yang tidak tersembunyi dilakukan dengan adil *.

tail -n +1 *

(Sebenarnya, tail -n +1 -- *diperlukan jika salah satu nama file dimulai dengan a -.)

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Pendek dan manis, terima kasih! Apakah Anda tahu di mana saya dapat membaca tentang --pengubah?
Znarkus
2
@Narkus: --untuk menandakan akhir opsi adalah konvensi yang dipatuhi sebagian besar perintah. Misalnya tail -n +1 -- -f -gmemberitahu tailitu -fdan -gmerupakan file untuk dibaca (operan) dan bukan opsi. Ini adalah pedoman 10 dalam pedoman sintaks utilitas POSIX (dokumen yang ditujukan untuk penulis utilitas). Saya tidak memiliki saran bacaan yang ditujukan untuk pengguna akhir, saya berharap tutorial unix yang baik untuk membahasnya di beberapa titik.
Gilles 'SO- berhenti bersikap jahat'
Hanya komentar, karena banyak jawaban lain yang mengusulkan untuk digunakan find, tetapi kemudian menggunakan beberapa exec dengan format cetak: Cara mudah untuk menggunakan finddan tailadalah: find . -type f -print0 -name "*" | xargs -0 tail -n +1 -- ( -print0dan xargs -0dan --memastikan bahwa perintah juga bekerja dengan nama file dengan spasi atau mulai dengan -)
IanH
14

Anda dapat melakukan semuanya dalam satu dengan find:

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

Itu memberitahu finduntuk menemukan semua file ( -type f) di direktori saat ini ( .) kecuali ( -not) satu bernama .htaccess( -name .htaccess). Kemudian ia mencetak ( -printf) baris baru diikuti dengan nama file ( %p), dan kemudian berjalan catpada file ( -exec cat {} \;). Itu akan memberi Anda output seperti:

test/test3
Line 1

test/test2
Line 1

test/test1
Line 1
Line 2
Line 3

Jika Anda sering melakukan ini, mungkin ada gunanya menempelkannya di skrip shell atau fungsi; Saya punya satu nama catsyang melakukan hal itu:

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

Itu loop atas setiap argumen nama file, mencetak nama file (dalam huruf tebal hijau), dan kemudian kucing file:

Contoh tangkapan layar

Maka perintahnya adalah:

$ find . -type f -not -name .htaccess -exec cats {} \+
Michael Mrozek
sumber
Yang lain lebih pendek, jadi terima itu. Jawaban yang sangat bagus, terima kasih!
Znarkus
6

Untuk menampilkan konten semua file di folder saat ini, coba:

grep -vI "\x00" -- *

dan serupa, tetapi secara rekursif:

grep -vIr "\x00" -- .

Formatnya akan: filename: content.

Untuk memiliki format yang sama seperti yang disarankan, itu akan menjadi:

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

Catatan samping:

  • Menggunakan NUL ( \x00) dalam contoh di atas mencegah menampilkan file biner (yang -Isebenarnya sedang dilakukan, tetapi kami masih menggunakan beberapa pola).
  • Menggunakan wildcard ( *), secara otomatis mengabaikan file tersembunyi seperti .htaccess.

Lihat juga: grep: tampilkan nama file satu kali, lalu tampilkan konteks dengan nomor baris di Unix SE

kenorb
sumber
2
Biasanya grep -r ^sudah cukup.
catpnosis
2

Anda bisa menggunakan ini:

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

Jika Anda ingin menyempurnakan dan tidak kehilangan terlalu banyak waktu dengan pipa, temukan dan semuanya (meskipun menjadi toolchain paling kuat yang pernah Anda temukan)

coba saja menggunakan for-loop, cat, dll.

tiktak
sumber
0

Jika Anda ingin mencetaknya, gunakanlah secara rekursif (untuk file dengan ekstensi .sql, misalnya):

find -name "*.sql" -exec cat {} \; > all.sql
Andrade
sumber