Yanıtlar:
Bash yerleşik yeniden yönlendirme (tldp) kullanın :
cat file2 >> file1
sudo
için cat
komuta (ve istenirse kimlik bilgilerini girin).
tee
programın: cat 1 | tee -a 2 3
. --append
(Veya -a
kısa olarak) geçişten sonra istediğiniz kadar dosya koyabilirsiniz .
cat file2 >> file1
>>
Operatör adlı dosyaya çıktı ekler veya yoksa adlı dosya oluşturur.
cat file1 file2 > file3
Bu, iki veya daha fazla dosyayı bire birleştirir. İstediğiniz kadar kaynak dosyaya sahip olabilirsiniz. Örneğin,
cat *.txt >> newfile.txt
Güncelleme 20130902
Yorumlarda eumiro "deneme cat file1 file2 > file1
." Bunun beklenen sonucu vermemesinin nedeni, yönlendirmeyi alan dosyanın, komutun solundaki komut >
yürütülmeden önce hazırlanmasıdır . Bu durumda, önce file1
sıfır uzunluğa kesilir ve çıktı için açılır, sonra cat
komut şimdi sıfır uzunluktaki dosyayı artı file2
içine içeriğini birleştirmeye çalışır file1
. Sonuç, orijinal içeriğinin file1
kaybolması ve yerine bir kopya olması file2
muhtemeldir.
Güncelleme 20160919
Yorumlarda tpartee, destek bilgilerine / kaynaklarına bağlanmayı önermektedir. Yetkili bir referans için, tür okuyucuyu linuxcommand.org adresindeki sh man sayfasına yönlendiriyorum:
Bir komut yürütülmeden önce, girişi ve çıkışı kabuk tarafından yorumlanan özel bir gösterimle yeniden yönlendirilebilir.
Bu okuyucuya ne bilmeleri gerektiğini söylese de, aramıyorsanız ve ifade kelimesini kelime ile ayrıştırırsanız kaçırmanız kolaydır. Burada en önemli kelime 'önce' olmak. Komut yürütülmeden önce yönlendirme tamamlanır (veya başarısız olur) .
cat file1 file2 > file1
Kabuk örneğinde, ilk önce yönlendirmeyi gerçekleştirir, böylece G / Ç tutamaçları, komutun yürütülmeden önce yürütüleceği ortamda yerinde olur.
Yeniden yönlendirme önceliğinin uzun süredir ele alındığı daha dostça bir versiyon, Ian Allen'ın web sitesinde Linux eğitim yazılımı şeklinde bulunabilir. Onun I / O Yönlendirme Notları sayfa yönlendirme bile komuta olmadan çalıştığını gözlem dahil konuyla ilgili söylenecek çok şey vardır. Bunu kabuğa geçirmek:
$ >out
... adlı boş bir dosya oluşturur. Kabuk önce G / Ç yönlendirmesini ayarlar, ardından bir komut arar, hiçbirini bulamaz ve işlemi tamamlar.
cat file1 file2 > file1
- bu muhtemelen beklediğiniz gibi çalışmaz.
>>
hangi olacaktır dosyayı değiştirin file1
. T.Rob, aslında yanlış olan bir şeyi sunmak için yarışmak yerine cevabını açıklamaktan çok daha üstün bir iş çıkardı. Sorunun metnine dayanarak, cat file1 file2 > file3
bunun @asir'in aradığı uygun komut olduğuna inanıyorum .
>
ilk olarak gerçekleştirilmesidir. Bu nedenle, yürütme cat file1 file2 > file1
önce yavaşlar file1
ve şimdi sıfır uzunluktaki dosyayı kendi üzerine kopyalamaya çalışır. Bu, operasyonların gerçekleşebileceği ve gerçekleşmesi gereken sırayı düşündüğünüzde mantıklıdır, ancak birçok insanı şaşırtarak yakalayabilecek kadar incedir. Yani başka bir şey yoksa, eumiro ve siz cevabı daha da geliştirdiniz. Bunun için teşekkürler!
>>
eklenir ve dosyayı >
değiştirir .
Not : sudo kullanmanız gerekiyorsa , bunu yapın:
sudo bash -c 'cat file2 >> file1'
sudo
Ayrıcalık yükselmesi çıkış yeniden yönlendirmesine aktarılmadığından, komuta basitçe alışmanın olağan yöntemi başarısız olur.
cat file2 | sudo tee -a file1 > /dev/null
Sadece referans olarak, ddrescue kullanmak, örneğin büyük dosyalarınız varsa ve daha sonra bazı noktalarda duraklama ve sonra devam etme gereksiniminiz varsa görevi gerçekleştirmenin kesilebilir bir yolunu sağlar:
ddrescue -o $(wc --bytes file1 | awk '{ print $1 }') file2 file1 logfile
Önemli logfile
olan. Ctrl-C
Aynı komutu tekrar belirterek işlemi durdurabilir logfile
ve devam ettirebilirsiniz; ddrescue kaldığı yerden okuyacak ve devam edecektir. -o A
Bayrak bayt başlamak ddrescue söyler A çıkış dosyasında ( file1
). Yani wc --bytes file1 | awk '{ print $1 }'
sadece file1
bayt cinsinden boyutunu çıkarır (isterseniz çıktıya yapıştırabilirsiniz ls
).
Yorumlarda ngks tarafından belirtildiği gibi , dezavantajı ddrescue'nun varsayılan olarak yüklenmeyeceği, bu yüzden manuel olarak yüklemeniz gerekecek. Diğer komplikasyon, depolarınızda olabilecek iki ddrescue sürümünün olmasıdır: daha fazla bilgi için bu askubuntu sorusuna bakın . İstediğiniz sürüm GNU ddrescue'dur ve Debian tabanlı sistemlerde şu paket bulunur gddrescue
:
sudo apt install gddrescue
Diğer dağıtımlar için ddrescue uygulamasının GNU sürümü için paket yönetim sisteminizi kontrol edin .
Başka bir çözüm:
cat file1 | tee -a file2
tee
istediğiniz kadar dosya ekleyebilme avantajına sahiptir, örneğin:
cat file1 | tee -a file2 file3 file3
içeriğini ekler file1
için file2
, file3
ve file4
.
Man sayfasından:
-a, --append
append to the given FILEs, do not overwrite
cat
kolay çözüm olabilir, ancak büyük dosyaları birleştirdiğimizde çok yavaş hale gelir find -print
, kediyi bir kez kullanmanız gerekse de sizi kurtarmaktır.
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)
ve yalnızca cat komutunuza benzer sonuçlar vermelidir.
cat
Dürüst olmak gerekirse cat
daha okunabilir olmasına rağmen bunu da yapabilirsiniz :
>> file1 < file2
>>
Ekler STDIN için file1
ve <
döker file2
için STDIN .