cat всі файли, крім вибраних


1

Якщо є якийсь синтаксис, щоб я міг cat всі файли в каталозі, крім вибраних. Наприклад, припустимо, що у мене є ~ 1200 текстових файлів, що містять рядку, приблизно 3 або 4 рядки на файл, окрім декількох файлів:

readme.md
contrib.rst
licence.txt

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

Я спробував наступну команду:

cat !{readme.md,contrib.rst,licence.txt}*.*

тому що я побачив десь використання cat наступним чином:

cat [!t][!m][!p]*.sh

Я думав, що з тих пір, {a,b} означає набір у bash-скриптах, заперечуючи, що повинен працювати. Звичайно, я помилявся.

Відповіді:


4

Спробуйте це з розширеною функцією порівняння шаблонів bash:

shopt -s extglob
cat !(readme.md|contrib.rst|licence.txt)

Я віддаю перевагу цьому, оскільки він не змінював GLOBIGNORE. Менше оболонка інвазивна :-)
Hastur

2

Спробуйте це з bash:

GLOBIGNORE="readme.md:contrib.rst:licence.txt"
cat *
unset GLOBIGNORE

Хороший. І відповідність OPs запиту на конкретну оболонку. +1
Hennes

Краще інший, ви повинні стерти (забути) попереднє значення GLOBIGNORE.
Hastur

1

Що ви вже спробували?

Чи завжди є ті самі файли, які потрібно пропустити.

У такому випадку ви могли б жорстко кодувати їх у команді. Напр. щось на зразок
find ! -name readme.md -o ! -name contrib.rst -o ! -name licence.txt -exec cat {} \+

Тепер, якщо ви хочете щось, що пропускає всі файли, що перевищують 4 рядки, не знаючи назви файлів заздалегідь, рішення, очевидно, стане більш складним. У такому випадку відредагуйте свою публікацію.


Вам не потрібно уникати +.
G-Man

Несвідома звичка від \; :(
Hennes

1

Без зміни поточного налаштування оболонки можна виконати кожну пропозицію Сайруса в дочірній оболонці

(GLOBIGNORE="readme.md:contrib.rst:licence.txt" ; cat *)

так само, як

(shopt -s extglob; cat !(readme.md|contrib.rst|licence.txt))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.