У меня есть два файла: file1
и file2
. Как добавить содержимое file2
в file1
чтобы содержимое file1
сохранялось в процессе?
Как добавить один файл к другому в Linux из оболочки?
Ответ 1
Используйте встроенное перенаправление bash (tldp):
cat file2 >> file1
Ответ 2
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. Оболочка сначала устанавливает перенаправление ввода/вывода, затем ищет команду, не находит ни одной и завершает операцию.
Ответ 3
Примечание: если вам нужно использовать sudo, сделайте следующее:
sudo bash -c 'cat file2 >> file1'
Обычный способ простого добавления команды sudo
к команде не удастся, так как эскалация привилегий не переносится в перенаправление вывода.
Ответ 4
Попробуйте выполнить следующую команду:
cat file2 >> file1
Ответ 5
команда, которую вы ищете,
cat file2 >> file1
Ответ 6
cat file1 file2 > file3
file1
и file2
- это два разных файла, и они добавляются для создания третьего файла результата (file3
).
Ответ 7
Просто для справки, использование 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.
Ответ 8
Другое решение:
cat file1 | tee -a file2
tee
имеет то преимущество, что вы можете добавить столько файлов, сколько хотите, например:
cat file1 | tee -a file2 file3 file3
добавит содержимое file1
в file2
, file3
и file4
.
На странице man:
-a, --append
append to the given FILEs, do not overwrite
Ответ 9
cat
может быть простым решением, но при очень больших объемах, когда мы конкатенируем большие файлы, find -print
должен спасти вас, хотя вам придется использовать cat один раз.
[email protected] ~/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
[email protected] ~/work/python/tmp $ time cat bigFile1.txt bigFile2.txt >> out.txt
real 0m3.084s
user 0m0.012s
sys 0m2.308s
[email protected] ~/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
Ответ 10
Вы также можете сделать это без cat
, хотя, честно говоря, cat
более читабелен:
>> file1 < file2
>>
добавляет STDIN к file1
а file1
<
file2
к STDIN.
Ответ 11
Я не уверен в этом, но многие люди говорили мне, что использование команды cat
для отображения содержимого одного файла не является хорошей практикой, и кто-то поделился этой ссылкой со мной.
Учитывая все это, следующий путь кажется лучше.
echo -n "$(<file1)" >> file2