Có công cụ nào trong linux để chia một tập tin tại chỗ không?


16

Tôi có một tệp 500G mà tôi muốn tách trong linux, nhưng tôi không có 500G khác để chạy split(1).

Có một công cụ hoặc tập lệnh nào sẽ chia tập tin tại chỗ thành các khối 1G trong khi sử dụng không gian thêm tối thiểu không?

Câu trả lời:


13
#!/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.


2
lưu ý rằng bạn có thể sử dụng 'dd if = / dev / null of = "$ {tên tệp}" seek = 1 bs = $ (($ size - $ _size))' nếu vì lý do nào đó bạn không cắt ngắn
ngoozeff

1
Cảm ơn, kịch bản hoạt động tuyệt vời! Nếu có lỗi xảy ra, chúng tôi không muốn xóa tệp, dòng cuối cùng tốt hơn là:if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
Oleg Mikheev

Ngoài ra, cần phải đề cập rằng tập lệnh này yêu cầu thêm dung lượng, bằng với kích thước phần (nếu bạn chia 500GB thành hai phần, bạn sẽ cần 250GB)
Oleg Mikheev

Tôi sẽ thêm rằng khi tôi chuyển giá trị 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í.
Xavier Leprêtre

3

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ì ddkhông thể xử lý một bstham số lớn như vậy .

Vì vậy, tôi đã tùy chỉnh tập lệnh để tạo bs=1Mvà 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ụ, 50000cho 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}"

1

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ó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.