Câu trả lời:
#!/bin/bash
# (c) whitequark 2010
set -e
if [ $# != 2 ]; then
echo "Usage: $0 <filename> <part size>"
echo " This script will split file to multiple parts, starting from"
echo " the end, and truncating the original file in process."
echo " Part size is specified in bytes."
echo " Use at your own risk."
exit 0
fi
filename=$1
partsize=$2
size=$(stat -c '%s' "${filename}")
parts=$(($size / $partsize))
do_split() {
_part=$1
_size=$2
echo "Splitting part $_part"
echo $(($partsize * ($_part - 1)))
dd if="${filename}" of="${filename}.$(printf '%04d' $_part)" \
count=1 bs=$partsize skip=$(($_part - 1))
echo "Truncating source file"
truncate "${filename}" --size="-$_size"
}
lastsize=$(($size % $partsize))
if [ $lastsize != 0 ]; then
do_split $(($parts + 1)) $lastsize
fi
for i in $(seq $parts -1 1); do
do_split $i $partsize
done
rm "${filename}"
gedit đã chạy thành công sau khi tháo rời và lắp ráp lại.
if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
10737418240
, tức là 10GB, nó đã tạo sai tệp 2GB. Tôi đã chia một tệp 300 GB và có 30 GB miễn phí.
Tôi thấy tập lệnh @whitequark thực sự hữu ích. Nhưng tôi muốn chia một hình ảnh đĩa 500 GB thành một số lượng lớn khoảng 50 GB mỗi cái. Bằng cách này, tập lệnh thất bại, vì dd
không thể xử lý một bs
tham số lớn như vậy .
Vì vậy, tôi đã tùy chỉnh tập lệnh để tạo bs=1M
và yêu cầu megabyte thay vì byte. Bây giờ tôi có thể phân chia tại chỗ và trong các khối thực sự lớn bằng cách sử dụng, ví dụ, 50000
cho 50 GB.
#! / bin / bash # (c) Whitequark 2010 # (c) dertalai 2015 (sửa đổi tối thiểu) đặt -e nếu [$ #! = 2]; sau đó tiếng vang "Cách sử dụng: $ 0" echo "Tập lệnh này sẽ chia tệp thành nhiều phần, bắt đầu từ" lặp lại "kết thúc và cắt bớt tệp gốc trong quá trình." echo "Kích thước phần được chỉ định bằng megabyte (1 MB = 1048576 byte)." echo "Sử dụng có nguy cơ của riêng bạn." thoát 0 fi tên tệp = $ 1 # partize = $ 2 phần kích thước MB = $ 2 partize = $ (($ 2 * 1048576)) size = $ (stat -c '% s' "$ {tên tệp}") bộ phận = $ (($ size / $ partize)) do_split () { _part = $ 1 _size = $ 2 echo "Chia phần $ _part" echo $ (($ partize * ($ _part - 1))) dd if = "$ {tên tệp}" của = "$ {tên tệp}. $ (printf '% 04d' $ _part)" \ đếm = $ partizeMB bs = 1M bỏ qua = $ ((($ _ phần - 1) * $ partizeMB)) echo "Cắt nguồn tập tin" cắt ngắn "$ {tên tệp}" --size = "- $ _ size" } kéo dài = $ (($ size% $ partize)) if [$ kéo dài! = 0]; sau đó do_split $ (($ phần + 1)) $ kéo dài fi cho i bằng $ (seq $ phần -1 1); làm do_split $ i $ partize làm xong rm "$ {tên tệp}"
Bạn có thực sự có tệp 500GB chưa? Nếu bạn đang tạo một tệp 500 GB bằng cách lưu trữ một thư mục hoặc đĩa, sau đó cố gắng tách nó ra, bạn có thể tách nó ra một cách nhanh chóng bằng cách chia đầu ra của tar (hoặc bất cứ thứ gì bạn đang sử dụng) thành tách:
sudo tar cvjsp /Volumes/BackupDisk/Backups.backupdb/ | \
split -d -b 4480m - Backups.backupdb.tar.bz2.
Điều này sẽ tạo ra các phần tách cỡ DVD của một kho lưu trữ cơ sở dữ liệu cỗ máy thời gian của tôi. Tuy nhiên, nó làm cho tất cả chúng cùng một lúc, điều đó có nghĩa là nó thực sự không làm những gì bạn đang tìm kiếm.
Xem câu hỏi của tôi ở đây để biết thêm. Kịch bản của Whitequark có thể hữu ích ở đó với một số sửa đổi nhỏ! Tôi sẽ phải thử nó.