Как добавить один файл к другому в Linux из оболочки? - PullRequest
391 голосов
/ 11 февраля 2011

У меня есть два файла: file1 и file2.Как добавить содержимое file2 к file1, чтобы содержимое file1 сохранило процесс?

Ответы [ 9 ]

572 голосов
/ 11 февраля 2011

Использовать встроенное перенаправление bash (tldp) :

cat file2 >> file1
285 голосов
/ 11 февраля 2011

cat file2 >> file1

Оператор >> добавляет вывод в именованный файл или создает именованный файл, если он не существует.

cat file1 file2 > file3

Это объединяет два или более файлов в один.Вы можете иметь столько исходных файлов, сколько вам нужно.Например,

cat *.txt >> newfile.txt

Обновление 20130902
В комментариях eumiro предлагает "не пытайтесь cat file1 file2 > file1".Причина, по которой это может не привести к ожидаемому результату, состоит в том, что файл, получающий перенаправление, готовится до выполнения команды слева от >.В этом случае сначала file1 усекается до нулевой длины и открывается для вывода, затем команда cat пытается объединить теперь файл нулевой длины плюс содержимое file2 в file1.В результате исходное содержимое file1 теряется и на его месте находится копия file2, которая, вероятно, не соответствует ожидаемой.

Обновление 20160919
В комментариях tpartee предлагает ссылки на информацию / источники поддержки.Для авторитетной ссылки я направляю любезного читателя на страницу sh man по адресу linuxcommand.org, где говорится:

Перед выполнением команды ее ввод и вывод могут быть перенаправленыиспользуя специальную запись, интерпретируемую оболочкой.

Хотя это действительно говорит читателю, что им нужно знать, его легко пропустить, если вы не ищете его и не анализируете оператор слово за словом.Самое важное здесь слово «до».Перенаправление завершено (или не выполнено) до выполнения команды.

В примере cat file1 file2 > file1 оболочка сначала выполняет перенаправление так, чтобы дескрипторы ввода-вывода были на местев среде, в которой команда будет выполнена до ее выполнения.

Более дружелюбная версия, в которой приоритет перенаправления подробно описан, можно найти на веб-сайте Яна Аллена в форме учебного курса по Linux.Его страница I / O Redirection Notes может многое рассказать по этой теме, включая наблюдение, что перенаправление работает даже без команды.Передача этого в оболочку:

$ >out

... создает пустой файл с именем out.Оболочка сначала устанавливает перенаправление ввода / вывода, затем ищет команду, не находит ни одной и завершает операцию.

39 голосов
/ 24 июня 2014

Примечание : если вам нужно использовать sudo , сделайте следующее:

sudo bash -c 'cat file2 >> file1'

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

27 голосов
/ 11 февраля 2011

Попробуйте эту команду:

cat file2 >> file1
22 голосов
/ 11 февраля 2011

команда, которую вы ищете:

cat file2 >> file1
13 голосов
/ 10 августа 2013

Просто для справки, использование ddrescue обеспечивает прерываемый способ выполнения задачи, если, например, у вас есть большие файлы и вам нужно приостановить и затем продолжить в более поздний момент:

ddrescue -o $(wc --bytes file1 | awk '{ print $1 }') file2 file1 logfile

logfile - важный бит. Вы можете прервать процесс с помощью Ctrl-C и возобновить его, указав ту же самую команду снова, и ddrescue прочитает logfile и возобновит с того места, где оно было прервано. Флаг -o A указывает ddrescue начинать с байта A в выходном файле (file1). Так что wc --bytes file1 | awk '{ print $1 }' просто извлекает размер file1 в байтах (вы можете просто вставить в вывод из ls, если хотите).

Как указано ngks в комментариях, недостатком является то, что ddrescue, вероятно, не будет установлен по умолчанию, поэтому вам придется устанавливать его вручную. Другая сложность заключается в том, что в ваших репозиториях могут быть две версии ddrescue: см. этот вопрос по Askubuntu для получения дополнительной информации. Требуемая версия - GNU ddrescue, а в системах на основе Debian - пакет с именем gddrescue:

sudo apt install gddrescue

Для других дистрибутивов проверьте вашу систему управления пакетами для GNU версии ddrescue.

1 голос
/ 07 октября 2017

Другое решение:

cat file1 | tee -a file2

tee имеет то преимущество, что вы можете добавлять столько файлов, сколько хотите, например:

cat file1 | tee -a file2 file3 file3

добавит содержимое file1 к file2, file3 и file4.

со страницы руководства:

-a, --append
       append to the given FILEs, do not overwrite
0 голосов
/ 13 марта 2018

Вы также можете сделать это без cat, хотя честно cat более читабельно:

>> file1 < file2

>> добавляет STDIN file1 и < дампы file2 до STDIN .

0 голосов
/ 24 мая 2016

cat может быть простым решением, но оно становится очень медленным, когда мы объединяем большие файлы, find -print спасет вас, хотя вам придется использовать cat один раз.

amey@xps ~/work/python/tmp $ ls -lhtr
total 969M
-rw-r--r-- 1 amey amey 485M May 24 23:54 bigFile2.txt
-rw-r--r-- 1 amey amey 485M May 24 23:55 bigFile1.txt

 amey@xps ~/work/python/tmp $ time cat bigFile1.txt bigFile2.txt >> out.txt

real    0m3.084s
user    0m0.012s
sys     0m2.308s


amey@xps ~/work/python/tmp $ time find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1

real    0m2.516s
user    0m0.028s
sys     0m2.204s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...