Saya ingin menyalin isi dari lima file ke satu file apa adanya. Saya mencoba melakukannya menggunakan cp untuk setiap file. Tapi itu menimpa konten yang disalin dari file sebelumnya. Saya juga mencoba
paste -d "\n" 1.txt 0.txt
dan itu tidak berhasil.
Saya ingin skrip saya menambahkan baris baru di akhir setiap file teks.
misalnya. File 1.txt, 2.txt, 3.txt. Masukkan konten 1,2,3 ke dalam 0.txt
Bagaimana saya melakukannya ?
Jawaban:
Anda memerlukan perintah
cat
(kependekan untuk concatenate), dengan pengalihan shell (>
) ke file output Andasumber
>>
untuk menambahkan satu file ke file lain, di mana>
menimpa file output dengan apa pun yang diarahkan ke dalamnya. Sedangkan untuk baris baru, apakah ada baris baru sebagai karakter pertama dalam file1.txt
? Anda dapat mengetahuinya dengan menggunakanod -c
, dan melihat apakah karakter pertama adalah a\n
.{...}
untuk pencocokan nama file, jadi mungkin tanda kutunya sedikit mengacaukan skrip Anda? Saya selalu mencoba bekerja dengan hal-hal seperti ini menggunakanls
shell. Ketika saya mendapatkan perintah dengan benar, saya hanya memotong-n-tempelkan ke skrip apa adanya. Anda juga mungkin menemukan-x
opsi ini berguna dalam skrip Anda - itu akan menggemakan perintah yang diperluas dalam skrip sebelum eksekusi.Pilihan lain, bagi Anda yang masih menemukan posting ini seperti yang saya lakukan, adalah menggunakan
find -exec
:Dalam kasus saya, saya membutuhkan opsi yang lebih kuat yang akan memeriksa banyak subdirektori sehingga saya memilih untuk menggunakannya
find
. Hancurkan:Lihat di dalam direktori kerja saat ini.
Hanya tertarik pada file, bukan direktori, dll.
Kurangi hasil yang ditentukan nama
Jalankan perintah cat untuk setiap hasil. "+" berarti hanya 1 instance dari
cat
spawned (thx @gniourf_gniourf)Seperti dijelaskan dalam jawaban lain, tambahkan konten cat-ed ke akhir file output.
sumber
*.txt
harus dikutip (jika tidak, seluruhfind
perintah, seperti yang tertulis, tidak berguna). Kelemahan lain datang dari kesalahpahaman kotor: perintah yang dieksekusi bukancat >> 0.txt {}
, tapicat {}
. Perintah Anda sebenarnya setara dengan{ find . -type f -name *.txt -exec cat '{}' \; ; } >> 0.txt
(saya menambahkan pengelompokan sehingga Anda menyadari apa yang sebenarnya terjadi). Kelemahan lainfind
adalah akan menemukan file0.txt
, dancat
akan mengeluh dengan mengatakan bahwa file input adalah file output .>> output.file
di akhir perintah Anda, sehingga Anda tidak membujuk siapa pun (termasuk diri Anda) untuk berpikir yangfind
akan mengeksekusicat {} >> output.file
untuk setiap file yang ditemukan.-exec cat {} +
alih-alih-exec cat {} \;
, sehingga hanya satu instance daricat
yang dihasilkan dengan beberapa argumen (+
ditentukan oleh POSIX ).find . -type f -exec cat {} + >> outputfile.txt
dan tidak bisa mengetahui mengapa file output saya tidak akan berhenti tumbuh menjadi pertunjukan walaupun direktori hanya 50 MB. Itu karena saya terus menambahkan outputfile.txt ke dirinya sendiri! Jadi pastikan untuk memberi nama file itu dengan benar atau letakkan di direktori lain sepenuhnya untuk menghindari ini.jika Anda memiliki tipe output tertentu maka lakukan sesuatu seperti ini
sumber
file_1
,,file_2
…file_11
, Karena urutan alami bagaimana file diurutkan.Jika semua file Anda berada dalam direktori tunggal, Anda bisa melakukannya
cat * > 0.txt
File 1.txt, 2.txt, .. akan masuk ke 0.txt
sumber
file_1
,,file_2
…file_11
, Karena urutan alami bagaimana file diurutkan.Saya menemukan halaman ini karena saya harus menggabungkan 952 file menjadi satu. Saya menemukan ini berfungsi lebih baik jika Anda memiliki banyak file. Ini akan melakukan perulangan untuk berapa banyak angka yang Anda butuhkan dan cat masing-masing menggunakan >> untuk menambahkan ke akhir 0.txt.
sumber
Jika semua file Anda dinamai serupa, Anda bisa melakukannya:
sumber
Pilihan lain adalah
sed
:Atau...
Atau...
Atau tanpa pengalihan ...
Perhatikan bahwa baris terakhir tulis juga
merge.txt
(tidakwmerge.txt
!). Anda dapat menggunakanw"merge.txt"
untuk menghindari kebingungan dengan nama file, dan-n
untuk output diam.Tentu saja, Anda juga dapat mempersingkat daftar file dengan wildcard. Misalnya, dalam kasus file bernomor seperti dalam contoh di atas, Anda dapat menentukan rentang dengan kurung dengan cara ini:
sumber
jika file Anda berisi tajuk dan Anda ingin menghapusnya di file output, Anda dapat menggunakan:
sumber
Jika file asli berisi karakter yang tidak dapat dicetak, mereka akan hilang saat menggunakan perintah cat. Menggunakan 'cat -v', non-printable akan dikonversi ke string karakter yang terlihat, tetapi file output masih tidak mengandung karakter non-printable yang sebenarnya dalam file asli. Dengan sejumlah kecil file, alternatifnya mungkin dengan membuka file pertama dalam editor (misalnya vim) yang menangani karakter yang tidak dicetak. Kemudian manuver ke bagian bawah file dan masukkan ": r second_file_name". Itu akan menarik file kedua, termasuk karakter non-cetak. Hal yang sama dapat dilakukan untuk file tambahan. Ketika semua file telah dibaca, masukkan ": w". Hasil akhirnya adalah bahwa file pertama sekarang akan berisi apa yang ia lakukan semula, ditambah konten dari file yang dibaca.
sumber
Jika Anda ingin menambahkan konten 3 file ke dalam satu file, maka perintah berikut akan menjadi pilihan yang baik:
Ini akan menggabungkan konten semua file ke file4, melempar output konsol
/dev/null
.sumber