Показать содержимое многих файлов

19

Какой самый простой способ показать содержимое нескольких файлов из командной строки ? Мой каталог выглядит ниже.

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

Теперь я хотел бы просмотреть содержимое всех файлов, кроме .htaccess. Это может выглядеть примерно так:

WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b:
Contents of file WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b.

xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM:
Contents of file xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM.

[...]

Я думаю, что это должно быть выполнимо с помощью комбинации find, xargs и cat, но я не понял, как это сделать. Спасибо за ваше время!

Znarkus
источник
stackoverflow.com/questions/5917413/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

30

Две стандартные команды headи tailраспечатать заголовок с именем файла, если вы передаете им более одного аргумента файла. Чтобы напечатать весь файл, используйте tail -n +1(печатать с первой строки, т.е. все).

Здесь, похоже, вы хотите видеть каждый файл, кроме одного, имя которого начинается с точки. Точечные файлы «скрыты» под unix: они не отображаются в выводе по умолчанию lsили в подстановочном совпадении. Таким образом, сопоставление всех не скрытых файлов выполняется просто *.

tail -n +1 *

(Строго говоря, tail -n +1 -- *это необходимо, если одно из имен файлов начинается с -.)

Жиль "ТАК - прекрати быть злым"
источник
Коротко и мило, спасибо! Вы знаете, где я могу прочитать о --модификаторе?
Знаркус
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 {} \+
Михаил Мрозек
источник
Другой был короче, поэтому принял это. Отличный ответ, хотя, спасибо!
Знаркус
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на самом деле происходит, но мы все равно должны использовать какой-то шаблон).
  • Используя подстановочный знак ( *), он автоматически игнорирует скрытые файлы, такие как .htaccess.

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

kenorb
источник
2
Обычно этого grep -r ^достаточно.
кепноз
2

Вы можете использовать это:

cat $(find Directory/ -not -name *.htaccess)
Oskar
источник
1

Если вы хотите подстроиться и не тратить слишком много времени на трубы, найдите и все остальное (хотя это самый мощный набор инструментов, который вы когда-либо могли найти)

просто попробуйте использовать цикл for, cat и т. д.

TikTak
источник
0

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

find -name "*.sql" -exec cat {} \; > all.sql
Андраде
источник