Saya perlu menyatukan potongan dari dua file:
jika saya perlu menggabungkan seluruh file, saya bisa melakukannya
cat file1 file2 > output
Tapi saya harus melewati 1MB pertama dari file pertama, dan saya hanya ingin 10 MB dari file kedua. Kedengarannya seperti pekerjaan dd
.
dd if=file1 bs=1M count=99 skip=1 of=temp1
dd if=file2 bs=1M count=10 of=temp2
cat temp1 temp2 > final_output
Apakah ada kemungkinan untuk melakukan ini dalam satu langkah? yaitu, tanpa perlu menyimpan hasil antara? Bisakah saya menggunakan beberapa file input dd
?
oflag=append conv=notrunc
), sehingga filesystem yang melakukan alokasi tertunda (seperti XFS) paling mungkin untuk memutuskan file selesai ditulis ketika masih ada lagi yang harus dilakukan.dd
tidak dimintasync
, alokasi yang tertunda seharusnya tidak langsung masuk (kecuali jika memori ketat dalam hal ini, tidak ada metode yang akan menunda alokasi).bash
danmksh
yang tidak mengoptimalkan garpu untuk perintah terakhir dalam subkulit, Anda dapat membuatnya sedikit lebih efisien dengan mengganti subkulit dengan grup perintah. Untuk cangkang lain, seharusnya tidak masalah, dan pendekatan subkulit bahkan mungkin sedikit lebih efisien karena cangkang tidak perlu menyimpan dan mengembalikan stdout.Saya tidak berpikir Anda dapat dengan mudah membaca banyak file dalam satu
dd
permintaan, tetapi Anda dapat menambahkan untuk membangun file output dalam beberapa langkah:Anda harus menentukan keduanya
conv=notrunc
danoflag=append
. Yang pertama menghindari pemotongan output, yang kedua mulai menulis dari akhir file yang ada.sumber
Ingatlah bahwa itu
dd
adalah antarmuka mentah keread()
,write()
danlseek()
system call. Anda hanya dapat menggunakannya dengan andal untuk mengekstrak potongan data dari file biasa, perangkat blok dan beberapa perangkat karakter (seperti/dev/urandom
), yaitu file yangread(buf, size)
dijamin akan kembalisize
selama akhir file tidak tercapai.Untuk pipa, soket, dan sebagian besar perangkat karakter (seperti ttys), Anda tidak memiliki jaminan seperti itu kecuali Anda melakukan
read()
ukuran 1, atau menggunakandd
ekstensi GNUiflag=fullblock
.Jadi:
Atau:
Atau dengan cangkang dengan dukungan bawaan untuk operator pencari seperti
ksh93
:Atau
zsh
(dengan asumsi Andahead
mendukung-c
opsi di sini):sumber
$IFS
. Itu terlepas dari isi variabel / ekspansi. Lihat juga Implikasi keamanan dari lupa mengutip variabel dalam bash / POSIX shellsgdd
sebagai gantidd
. Apakah itu salah ketik, atau disengaja?Dengan isme bash , dan "penggunaan kucing yang tidak berguna" secara fungsional , tetapi paling dekat dengan sintaks yang digunakan OP:
(Dikatakan demikian, jawaban Stephen Kitt tampaknya merupakan metode yang paling efisien .)
sumber
<(...)
adalah kshisme yang keduanyazsh
danbash
disalin.