Показати вміст багатьох файлів


19

З командного рядка, який найпростіший спосіб відобразити вміст кількох файлів? Мій каталог виглядає, як показано нижче.

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

Тепер я хотів би переглянути вміст усіх файлів, крім .htaccess. Це може виглядати приблизно так:

WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b:
Contents of file WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b.

xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM:
Contents of file xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM.

[...]

Я думаю, що це можна зробити за допомогою комбінації знахідки, xargs та кота, але я не зрозумів, як це зробити. Дякую за ваш час!


Відповіді:


30

Дві стандартні команди headта tailнадрукуйте заголовок із ім'ям файлу, якщо ви передасте їм більше одного аргументу файлу. Щоб надрукувати весь файл, використовуйте tail -n +1(друкуйте з першого рядка далі, тобто все).

Тут схоже, що ви хочете побачити кожен файл, крім одного, ім'я якого починається з крапки. Файли з крапками "приховані" під unix: вони не відображаються у вихідних даних за замовчуванням lsабо в підстановці марок Таким чином, зіставлення всіх не прихованих файлів проводиться просто *.

tail -n +1 *

(Власне кажучи, tail -n +1 -- *це потрібно, якщо одне з назв файлів починається з а -.)


Короткий і милий, дякую! Чи знаєте ви, де я можу прочитати про --модифікатор?
Znarkus

2
@ Znarkus: --означати кінець параметрів - це умова, якій підкоряється більшість команд. Наприклад , tail -n +1 -- -f -gкаже , tailщо -fі -gфайли для читання (операндів) і не варіанти. Це керівництво 10 в настанові синтаксису утиліти POSIX (документ, призначений для авторів програми). У мене немає пропозицій для читання, призначених для кінцевих користувачів, я би сподівався, що в якийсь момент буде добре підручник для Unix.
Жил "ТАК - перестань бути злим"

Справедливе зауваження, тому що багато інших відповіді пропонують використовувати find, але потім використовувати деякі Exec з печаткою форматування: простим способом використання findі tailє: find . -type f -print0 -name "*" | xargs -0 tail -n +1 -- ( -print0а xargs -0і --переконайтеся , що команда також працює з іменами файлів з пробілами або починаючи з -)
IanH

14

Ви можете зробити все в одному за допомогою find:

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

Це говорить про те, findщоб знайти всі файли ( -type f) у поточному каталозі ( .), крім ( -not) одного з ім'ям .htaccess( -name .htaccess). Потім він друкує ( -printf) новий рядок, а потім ім'я файлу ( %p), а потім працює catна файл ( -exec cat {} \;). Це дасть вам вихід:

test/test3
Line 1

test/test2
Line 1

test/test1
Line 1
Line 2
Line 3

Якщо ви робите це часто, можливо, варто додати його до сценарію оболонки або функції; У мене є одне ім'я, catsяке робить саме це:

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

Він перетворює цикл на кожен аргумент імені файлу, виводить ім'я файлу (жирним жирним кольором), а потім відводить файл:

Приклад скріншоту

Тож команда буде просто:

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

Інший був коротшим, тому прийняв це. Хоча чудова відповідь, дякую!
Znarkus

6

Щоб показати вміст усіх файлів у поточній папці, спробуйте:

grep -vI "\x00" -- *

та подібні, але рекурсивно:

grep -vIr "\x00" -- .

Формат буде: filename: content.

Щоб мати подібний формат, як пропонується, було б:

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

Бічні нотатки:

  • Використання NUL ( \x00) у наведених вище прикладах запобігає відображенню бінарних файлів (що -Iнасправді робиться, але нам ще потрібно використовувати деякий шаблон).
  • Використовуючи wildcard ( *), він автоматично ігнорує приховані файли, такі як .htaccess.

Дивіться також: grep: відобразити ім'я файлу один раз, а потім відобразити контекст з номерами рядків на Unix SE


2
Зазвичай grep -r ^достатньо.
катпноз


1

Якщо ви хочете налагодити і не втрачати занадто багато часу на трубах, знайдіть і все (хоча це найпотужніший ланцюжок інструментів, який ви могли коли-небудь знайти)

просто спробуйте використовувати for-петлю, кота тощо.


0

Якщо ви також хочете надрукувати його, використовуйте рекурсивно (наприклад, для файлів із розширенням .sql):

find -name "*.sql" -exec cat {} \; > all.sql
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.