Как добавить один файл в другой в Ubuntu Linux?

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

    Использовать redirect bash (tldp) :

     cat file2 >> file1 

    cat file2 >> file1

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

    cat file1 file2 > file3

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

    cat *.txt >> newfile.txt

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

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

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

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

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

    Более дружественная версия, в которой приоритет перенаправления подробно рассматривается, можно найти на веб-сайте Ian Allen в виде учебных курсов Linux. Его страница « Перенаправления ввода-вывода ввода-вывода» может многое сказать по этой теме, включая наблюдение, что redirect работает даже без команды. Передача этого в оболочку:

     $ >out 

    … создает пустой файл с именем. Сначала shell устанавливает redirect ввода-вывода, затем ищет команду, не находит и завершает операцию.

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

    sudo bash -c 'cat file2 >> file1'

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

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

     cat file2 >> file1 

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

     cat file2 >> file1 

    Для справки, использование 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 }' wc --bytes file1 | awk '{ print $1 }' просто извлекает размер file1 в байтах (вы можете просто вставить вывод из ls если хотите).

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

     sudo apt install gddrescue 

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

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

     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 

    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 

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

    >> file1 < file2

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