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

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

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

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


Я посмотрел здесь . Не знаю, как использовать join.

21
задан 26 July 2017 в 12:14

8 ответов

Используйте 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
[ 1120] Это объединит все файлы в этом каталоге с текущим каталогом (не позволяя ему соответствовать самому выходному файлу). Он полностью независим от использования cat и перенаправления вывода - это просто Bash, предоставляющий все файлы в качестве аргументов cat.


Типы файлов

Он будет просто склеивать (объединять) файлы вместе, как вы это делали бы с бумагой и лентой. Его не волнует фактический формат файла, способный справиться с этим. Он будет работать для текстовых файлов, но не для PDF-файлов, ODT и т. Д. Что ж, он склеит их вместе, но больше не является действительным PDF / ODT.


Порядок объединения

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


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

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

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

  • Выберите более конкретный шаблон, соответствующий фактическим входным файлам, но не совпадающий с выходным именем. Пример: шаблон входных файлов *.txt с выходным файлом output.out не будет конфликтовать.
  • Работа в разных каталогах. В приведенном выше примере я использовал отдельный каталог input-files-dir для размещения всех файлов и вывода в текущий рабочий каталог. Это делает невозможным получение этой ошибки.
0
ответ дан 26 July 2017 в 12:14

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

cat file1 file2 > joined_file

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

0
ответ дан 26 July 2017 в 12:14

Сделайте это простым циклом:

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

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

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

0
ответ дан 26 July 2017 в 12:14

Это дополнение и вариация к другим ответам, связанным с применением этих решений в действиях обычая Тунара.

Не все из них могут быть использованы таким образом, но некоторые из них.

Я подумал, что наиболее интересным будет иметь возможность объединять выбранные файлы из контекстного меню Тунара .

Это отклонение от того, что было предложено Сади в комментарии к ответу gertvdijk :

   cat %N > JoinedFile

Только выбранные файлы будут объединены. Ограничьте условия отображения текстовыми файлами.

enter image description here

enter image description here


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

Я принял gertvdijk ответ как окончательный. Мало того, что это было поводом для комментария Сади, но, похоже, он представляет дополнительную ценность для других, предоставляя хорошо аргументированное и полное решение (хотя и несколько превосходящее мои навыки чтения CLI).

0
ответ дан 26 July 2017 в 12:14

Если файлы Вы хотите объединить весь конец в .txt, сохраните это простым:

cat *.txt > combined.txt

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

cat * > combined.txt

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

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

4
ответ дан 26 July 2017 в 12:14

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"
0
ответ дан 26 July 2017 в 12:14

Вы также можете попробовать команду 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.
0
ответ дан 26 July 2017 в 12:14

Вы также можете просто использовать онлайн-утилиту, такую ​​как merge-files-online.com

0
ответ дан 26 July 2017 в 12:14

Другие вопросы по тегам:

Похожие вопросы: