Ответы:
Используйте встроенное перенаправление bash (tldp) :
cat file2 >> file1
sudo
в cat
команде (и ввести учетные данные , если это будет предложено).
tee
программу cat 1 | tee -a 2 3
. Вы можете поместить столько файлов, сколько захотите после --append
(или -a
для краткости) переключения.
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 предлагает ссылки на информацию / источники поддержки. Для авторитетной ссылки я направляю доброго читателя на страницу man sh адресу linuxcommand.org, где говорится:
Перед выполнением команды ее ввод и вывод могут быть перенаправлены с использованием специальных обозначений, интерпретируемых оболочкой.
Хотя это говорит читателю, что им нужно знать, его легко пропустить, если вы не ищете его и анализируете утверждение слово за словом. Самое важное здесь слово «до». Перенаправление завершено (или не выполнено) до выполнения команды.
В примере с cat file1 file2 > file1
оболочка сначала выполняет перенаправление, чтобы дескрипторы ввода-вывода были в месте, в котором команда будет выполнена до ее выполнения.
Более дружелюбную версию, в которой приоритет перенаправления подробно описан, можно найти на веб-сайте Яна Аллена в форме учебного курса по Linux. Его страница « Примечания о перенаправлении ввода / вывода» может многое сказать по этой теме, включая наблюдение, что перенаправление работает даже без команды. Передав это в оболочку:
$ >out
... создает пустой файл с именем out. Оболочка сначала устанавливает перенаправление ввода / вывода, затем ищет команду, не находит ни одной и завершает операцию.
cat file1 file2 > file1
- это не сработает, как вы, вероятно, ожидаете.
>>
которая будет изменять файл file1
. T.Rob проделал гораздо лучшую работу, объясняя свой ответ, чем просто мчался, чтобы представить что-то, что было на самом деле неверно. Основываясь на тексте вопроса, я считаю, что cat file1 file2 > file3
это подходящая команда, которую искал @asir.
>
сначала выполняется операция справа от . Таким образом, выполнение cat file1 file2 > file1
сначала заклинило бы, а file1
затем попыталось скопировать файл нулевой длины на себя. Это имеет смысл, когда вы думаете о порядке, в котором операции могут и должны происходить, но достаточно тонко, чтобы застать многих врасплох. Так что, если ничего другого, eumiro и вы предложили дальнейшее улучшение ответа. Спасибо за это!
>>
добавляется к файлу и >
заменяет файл.
Примечание : если вам нужно использовать sudo , сделайте это:
sudo bash -c 'cat file2 >> file1'
Обычный метод простого добавления sudo
к команде не удастся, поскольку повышение привилегий не переносится в перенаправление вывода.
cat file2 | sudo tee -a file1 > /dev/null
Просто для справки, использование ddrescue обеспечивает прерываемый способ решения задачи, если, например, у вас есть большие файлы и вам нужно сделать паузу, а затем продолжить на более позднем этапе:
ddrescue -o $(wc --bytes file1 | awk '{ print $1 }') file2 file1 logfile
Это logfile
важный бит. Вы можете прервать процесс Ctrl-C
и возобновить его, указав ту же самую команду снова, и ddrescue прочитает logfile
и возобновит с того места, где он остановился. -o A
Флаг говорит ddrescue , чтобы начать с байта А в выходном файле ( file1
). Так wc --bytes file1 | awk '{ print $1 }'
что просто извлекает размер file1
в байтах (вы можете просто вставить в вывод из, ls
если хотите).
Как отмечено в комментариях ngks , недостатком является то, что ddrescue, вероятно, не будет установлен по умолчанию, поэтому вам придется установить его вручную. Другая сложность заключается в том, что в ваших репозиториях могут быть две версии ddrescue: дополнительную информацию смотрите в этом вопросе аскубунту . Нужная версия - 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
time (find . -maxdepth 1 -type f -name 'bigFile*' -print0 | xargs -0 cat -- > outFile1)
должны быть такими же, как у вашей команды cat only.
Вы также можете сделать это без cat
, хотя, честно говоря cat
, более читабельно:
>> file1 < file2
>>
Присоединяет STDIN к file1
и <
отвалов file2
на STDIN .