Як приєднати текстові файли?


21

Я зберегла багато документів у форматі txt. Я хочу надрукувати їх разом, тому спочатку хочу їх разом в одному файлі. Порядок не має значення в цьому випадку.

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

Чи можу я це зробити за допомогою команди чи якогось GUI?


Я зазирнув сюди . Не знаю, як користуватися join.

Відповіді:


43

Використовувати catз перенаправленням виводу. Синтаксис: cat file [file] [[file] ...] > joined-file.

Приклад із лише двома файлами (у вас може бути ще багато):

$ echo "some text in a file" > file1
$ echo "another file with some text" > file2
$ cat file1 file2 > mergedfiles
$ cat mergedfiles
some text in a file
another file with some text

Якщо у вас є "багато документів", скористайтеся глобулюванням шаблонів (шаблонами):

cat input-files-dir/* > joined-file

Це приєднає всі файли в цьому каталозі до поточного каталогу (не даючи йому відповідати самому вихідному файлу). Це абсолютно незалежно від використання catта виведення перенаправлення - це просто Bash, який надає всі файли як аргументи cat.


Типи файлів

Він просто склеїть (з'єднає) файли разом, як ви це зробили з папером та стрічкою. Це не байдуже, чи фактичний формат файлу здатний впоратися з цим. Він буде працювати для текстових файлів, але не для PDF-файлів, ODT-файлів і т.д.


Порядок вступу

Як зазначав phoibos, обшивка оболонки призведе до алфавітного порядку імен файлів. Так працює Bash and shell globing.


Додаток про input file is output fileпомилку

Коли шаблон вхідних файлів відповідає тому самому файлу, що і вихідний, це призведе до помилки. Це функція безпеки. Приклад: cat *.txt > out.txtзапустити другий раз це спричинить.

Що ви можете з цим зробити:

  • Виберіть більш конкретний шаблон, щоб відповідати фактичним вхідним файлам, не збігаючись з назвою виводу. Приклад: шаблон вхідних файлів *.txtіз вихідним файлом output.outне стикається.
  • Робота в різних довідниках. У наведеному вище прикладі я використовував окремий input-files-dirкаталог для розміщення всіх файлів і виведення в поточну робочу директорію. Це робить неможливим отримати цю помилку.

@cipricus Так, але це дуже основна глобальна оболонка (шаблони). Спробуйте свої шаблони, використовуючи lsлише список списків. Наприклад, ls *.txtщоб побачити, що відповідає.
gertvdijk

2
@cipricus Як щодо cat * .txt> JoinedFile.txt?
Саді

1
Насправді це більш здоровий глузд, кішка спочатку ловить усі файли .txt, а друге - приєднується до них, а по-третє - створює новий .txt файл, який неможливо спіймати на першому кроці ;-)
Саді

1
@cipricus Він просто приєднується до файлів. Як і ви, використовуючи шматочки паперу з клеєм і скотчем! Більшість форматів "документів", таких як PDF, які стискаються, цього не дозволяють. Використовуйте редактор PDF. Але все одно, ваше питання стосувалося текстових файлів .
gertvdijk

1
Я повністю розумію, що запропонований вами метод (створення підкаталогу, переміщення файлів і потім приєднання) може бути кращим способом у деяких випадках. Але якщо ми просто хочемо приєднати всі текстові файли (усі мають розширення .txt) у поточному каталозі cat * .txt> JoinedFile.txt виконує цю роботу ідеально. Я щойно перевірив це з цікавості, і він працює, і, схоже, Кіприк знайшов той самий результат. (І система почала скаржитися, що ми не повинні спілкуватися тут, інакше я б запитав, чи можете ви навчити цього новачка, як можна використовувати форматування в цих коментарях без панелі інструментів ;-)
Саді

12

Простий спосіб зробити це за допомогою кота:

cat file1 file2 > joined_file

Якщо ви просто видаєте, cat file1 file2ви побачите обидва файли на стандартному виході. Використовуючи >, ви просто перенаправляєте стандартний вихід до файлу. Це також буде працювати з іншими командами.


Прочитайте, будь ласка, питання. Ви говорите, щоб вказати окремі імена файлів, чого ОП спеціально не хотіла робити!
Шрі

2
Цього не було в первісному питанні. Я не оновлював свою відповідь, оскільки з’явилися більш повні відповіді.
Хорхе Суарес де Ліс

@ JorgeSuárezdeLis Хоча ця відповідь безпосередньо не допомагає ОП у його / її питанні, зауважте, що ця відповідь, ймовірно, допоможе іншому, у кого є лише кілька файлів, які вони хотіли б об'єднати. (о, ей, як я! дякую! ^ - ^) +1
Сута

@ JorgeSuárezdeLis Справді. Ви відповіли на редакцію 2 питання абсолютно чудово. Через кілька хвилин, редакція 3 , змінилися вимоги щодо відповідей.
gertvdijk

5

Зробіть це простою петлею:

for i in *.txt; do cat "$i" >> complete.txt; done

>> додає до файлу.

Примітка. Якщо вам з якоїсь причини доведеться запустити команду ще раз, її потрібно видалити complete.txt, інакше ви напишете файл собі, який не працює.


5
Це буде добре працювати, але я не бачу потреби в циклі for, якщо ви можете використовувати аргументи cat.
gertvdijk

1
Так, ти, звичайно, маєш рацію. Я просто не впевнений у використанні замовлення сардів cat *.txt. Цикл for повинен бути відсортований.
phoibos


Так, це точно така ж куля. Не має значення, використовуєте ви його forчи де-небудь ще в Bash.
gertvdijk

4

Якщо всі файли, які ви хочете об'єднати, закінчуються .txt, просто:

cat *.txt > combined.txt

Якщо каталог містить лише текстові файли, це також просто:

cat * > combined.txt

(Зауважте, що коли ви створюєте combined.txt, повторне виконання цього завдання включає його в розширення *, що призводить до незвичайної поведінки).

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


thnx. якщо ви подивитесь на коментарі до прийнятої відповіді, Саді запропонував саме це у коментарі. якби ваша відповідь була першою, ваша була б те, що мені потрібно. погляньте і на мою: додав, що в користувальницькому меню

Дякуємо за відгук. Так, я бачу зараз, це було трохи затьмарено ...
alexis

4

Користувальницький сценарій дій Thunar, написаний ципріком, також надихнув мене написати подібний сценарій Наутілуса, і я подумав, що він може бути корисним для інших, хто дивиться на цю запитання для ознайомлення з цього питання. Отже ось це:

#!/bin/sh
#Nautilus Script to join selected text files in a single file and open the joined file with default text editor
#
IFS=$'\n'
FILENAME="JoinedFile_$(date +%Y-%m-%d-%H-%M-%S).txt"
cat "$@" > "$FILENAME"
xdg-open "$FILENAME"

@David Foerster Дякую за редагування У мене не було проблем зі старою версією (з моїми обмеженими тестовими випадками), і я не бачу жодної проблеми з цією покращеною версією. Вибачте, якщо я заподіяв незручності через недолік у попередній версії.
Саді

Це не було помилкою, але він містив зайвий цикл, що ускладнило розуміння коду, imho.
Девід Фоерстер

2

Це доповнення та зміна інших відповідей, пов’язаних з приведенням цих рішень у відповідність до дій Тюнара.

Не всі вони є корисними таким чином, але деякі є.

Я подумав, що найцікавіше буде мати можливість об'єднати вибрані файли з контекстного меню Thunar .

Це відхилення від того, що було запропоновано Сади в коментарі до gertvdijk «s відповідь :

   cat %N > JoinedFile

Будуть приєднані лише вибрані файли. Обмежте умови появи текстовими файлами.

введіть тут опис зображення

введіть тут опис зображення


Особлива подяка Саді, чий коментар надав мені найбільш чітке і актуальне рішення моєї проблеми.

Я прийняв gertvdijk «s відповідь остаточним. Це не тільки було приводом для коментаря Саді, але, мабуть, надає додаткової цінності для інших, забезпечуючи добре аргументоване і повне рішення (хоча дещо вище моїх навичок читання CLI).


2

Ви також можете спробувати findкоманду,

find . -name "*.txt" -type f -exec cat {} + > file

Він знаходить .txtфайли всередині поточного каталогу та виконує catкоманду на кожному заснованому файлі. Нарешті, весь вихід був перенаправлений на ім'я файлу file(створений в межах самого поточного безпосередньо).

Пояснення:

.                  # current directory

-name              # helps to find only .txt files.

-type f            # Only files

-exec cat {} +     # helps to run cat command on the founded .txt files.

>                  # Output redirection operator

file               # to store final output.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.