Відповіді:
Використовуйте 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 пропонує посилання на резервну інформацію / джерела. Для авторитетного посилання я направляю доброго читача на сторінку sh man на linuxcommand.org, де зазначено:
Перед виконанням команди його введення та вихід можуть бути перенаправлені за допомогою спеціального позначення, інтерпретованого оболонкою.
Хоча це і говорить читачеві, що вони повинні знати, це легко пропустити, якщо ви не шукаєте цього і розбираєте заяву слово за словом. Найважливіше слово тут «раніше». Перенаправлення завершено (або не вдалося) до виконання команди.
У прикладі випадку cat file1 file2 > file1
оболонка спочатку виконує перенаправлення, щоб ручки вводу / виводу знаходилися на місці в середовищі, в якому команда буде виконуватися до її виконання.
Більш приємну версію, в якій пріоритет перенаправлення висвітлюється досить довго, можна знайти на веб-сайті Яна Аллена у формі навчальних програм Linux. Його сторінка Примітки про перенаправлення вводу / виводу має багато що сказати на цю тему, включаючи зауваження, що перенаправлення працює навіть без команди. Передача цього до оболонки:
$ >out
... створює порожній файл з іменем. Оболонка спочатку встановлює перенаправлення вводу / виводу, потім шукає команду, не знаходить жодної і завершує операцію.
cat file1 file2 > file1
- це не спрацює, як ти, напевно, чекаєш.
>>
якої буде модифікований файл file1
. T.Rob зробив набагато кращу роботу, пояснюючи свою відповідь, а не просто бігаючи, щоб подати щось, що фактично було невірним. Виходячи з тексту запитання, я вважаю, що cat file1 file2 > file3
це відповідна команда, яку шукав @asir.
>
виконується спочатку. Таким чином, виконання cat file1 file2 > file1
спочатку спершу клобує, file1
а потім спробує скопіювати файл, що має нульову довжину, на себе. Це має сенс, коли ви думаєте про порядок, в якому могли б і повинні відбуватися операції, але досить тонкий, щоб він здивував багатьох людей зненацька. Тож якщо нічого іншого, ви та eumiro спонукали до подальшого вдосконалення відповіді. Дякую за це!
>>
додається до нього та >
замінює його.
Примітка : якщо вам потрібно використовувати судо , зробіть це:
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: для отримання додаткової інформації див. Це питання askubuntu . Ви хочете, щоб версія GNU ddrescue, а в системах на базі Debian - пакет з назвою gddrescue
:
sudo apt install gddrescue
Для інших дистрибутивів перевірте систему управління пакунками на наявність GNU версії ddrescue.
Ще одне рішення:
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
- це врятувати вас, хоча вам доведеться використовувати кота один раз.
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
, хоча, якщо чесно cat
, читабельніше:
>> file1 < file2
>>
Приєднує STDIN до file1
і <
відвалів file2
на STDIN .