Как объединить текстовые файлы?

21

Я сохранил много документов в формате TXT. Я хочу напечатать их вместе, поэтому сначала я хочу, чтобы они были вместе в одном файле. Порядок не имеет значения в этом случае.

Мне нужно решение, которое не включает в себя ввод имен файлов, которые будут объединены, а решение, которое просто объединит все текстовые файлы в папке.

Могу ли я сделать это с помощью команды или некоторого графического интерфейса?


Я посмотрел здесь . Не знаю, как использовать 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 и т. Д. Что ж, он склеит их вместе, но больше не является действительным PDF / ODT.


Порядок присоединения

Как указывал Фойбос, глобализация оболочки приведет к алфавитному порядку имен файлов. Так работает Bash и shell.


Приложение об input file is output fileошибке

Когда шаблон входных файлов совпадает с тем же файлом, что и выходной, это вызовет ошибку. Это функция безопасности. Пример: cat *.txt > out.txtзапуск во второй раз вызовет это.

Что вы можете с этим поделать:

  • Выберите более конкретный шаблон, чтобы он соответствовал фактическим входным файлам, но не совпадал с выходным именем. Пример: шаблон входных файлов *.txtс выходным файлом output.outне будет конфликтовать.
  • Работа в разных каталогах. В приведенном выше примере я использовал отдельный input-files-dirкаталог для размещения всех файлов и вывода в текущий рабочий каталог. Это делает невозможным получение этой ошибки.
gertvdijk
источник
@cipricus Да, но это очень простая оболочка (шаблоны). Попробуйте свои шаблоны, используя lsтолько список совпадений. Например, ls *.txtчтобы увидеть, что соответствует.
gertvdijk
2
@cipricus Как насчет cat * .txt> JoinedFile.txt?
Сади
1
На самом деле это более здравый смысл: cat сначала перехватывает все файлы .txt, а затем присоединяет их, а в-третьих, создает новый файл .txt, который не может быть перехвачен на первом шаге ;-)
Sadi
1
@cipricus Это просто объединяет файлы. Как и при использовании кусочков бумаги с клеем и скотчем! Большинство форматов «документов», таких как PDF, которые сжимаются, не позволяют этого. Используйте редактор PDF. Но в любом случае, ваш вопрос был о текстовых файлах .
gertvdijk
1
Я полностью понимаю, что метод, который вы предлагаете (создание subdir, перемещение файлов и затем присоединение) может быть лучшим способом в некоторых случаях. Но если мы просто хотим объединить все текстовые файлы (все с расширением .txt) в текущем каталоге, cat * .txt> JoinedFile.txt отлично справится со своей задачей. Я просто проверил это из любопытства, и это работает, и кажется, что cipricus также нашел тот же результат. (И система начала жаловаться, что мы не должны здесь общаться, в противном случае я хотел бы спросить, можете ли вы научить этого новичка, как использовать форматирование в этих комментариях без панели инструментов ;-)
Sadi
12

Простой способ сделать это с помощью cat:

cat file1 file2 > joined_file

Если вы просто выполните cat file1 file2команду, вы увидите оба файла в стандартном выводе. Используя >, вы просто перенаправляете стандартный вывод в файл. Это будет работать и с другими командами.

Хорхе Суарес де Лис
источник
Пожалуйста, прочитайте вопрос. Вы говорите, чтобы указать отдельные имена файлов, которые ОП специально не хотел делать!
Шри
2
Этого не было в первоначальном вопросе. Я не обновил свой ответ, так как появились более полные ответы.
Хорхе Суарес де Лис
@ JorgeSuárezdeLis Хотя этот ответ напрямую не помогает ОП с его / ее вопросом, учтите, что этот ответ, вероятно, поможет кому-то еще, у кого есть несколько файлов, которые они хотели бы объединить. (о, эй, как я! спасибо! ^ - ^) +1
Souta
@ JorgeSuárezdeLis Действительно. Вы отлично ответили на 2-ю версию вопроса. Через несколько минут, редакция 3 , изменились требования к ответам.
gertvdijk
5

Сделайте это с помощью простого цикла:

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

>> добавляет в файл

Примечание. Если по какой-либо причине вам нужно будет снова запустить команду, вы должны удалить ее complete.txt, иначе вы бы записали файл себе, что не работает.

Phoibos
источник
5
Это также будет работать, но я не вижу необходимости в цикле for, если вы можете использовать аргументы для cat.
gertvdijk
1
Да, конечно, ты прав. Я просто не уверен в использовании порядка sord cat *.txt. Цикл for должен быть отсортирован.
Phoibos
Да, это точно такая же оболочка. Не имеет значения, используете ли вы его forили где-либо еще в Bash.
gertvdijk
4

Если файлы, которые вы хотите объединить, заканчиваются .txt, сделайте это просто:

cat *.txt > combined.txt

Если каталог содержит только текстовые файлы, это также просто:

cat * > combined.txt

(Обратите внимание, что после создания combined.txt, повторное выполнение будет включать его в расширение *, что приведет к странному поведению).

Если вы хотите выбрать некоторые файлы в каталоге, а не другие, лучше всего, если имена файлов позволяют вам определить, какие из них вы хотите. Если нет, вы можете полюбоваться find. Но я сомневаюсь, что вам нужно идти так далеко.

Alexis
источник
Thnx. Если вы посмотрите на комментарии к принятому ответу, Сади предложил именно это в комментарии. если бы ваш ответ был первым, ваш был бы тем, что мне нужно. взгляните на мой тоже: добавлено, что в пользовательском меню
Спасибо за ответ. Да, я вижу это сейчас, это было немного затенено ...
Алексис
4

Сценарий Thunar с настраиваемым действием, написанный cipricus, также вдохновил меня на написание подобного сценария Nautilus, и я подумал, что он может быть полезен для других, кто просматривает эти вопросы и ответы для справки по этому вопросу. Итак, вот оно:

#!/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"
Сади
источник
@ Дэвид Фёрстер Спасибо за редактирование. У меня не было проблем со старой версией (с моими ограниченными тестовыми примерами), и я не вижу никаких проблем и с этой улучшенной версией. Извините, если я вызвал какие-либо неудобства из-за недостатка в предыдущей версии.
Сади
Это не было изъяном, но содержало ненужный цикл, который делал код более сложным для понимания, 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.
Авинаш Радж
источник