Bỏ chỉ một số lượng tệp nhất định từ một tarball lớn


12

Tôi có một tarball lớn đang bận rộn với FTP từ hệ thống từ xa đến hệ thống cục bộ của chúng tôi.

Tôi muốn biết liệu có thể bắt đầu hủy ghép nối hay không, hãy nói 50 tệp cùng một lúc để các tệp đó có thể bắt đầu được xử lý trong khi quá trình chuyển diễn ra.

Câu trả lời:


11

Dưới đây là một lời giải thích chi tiết về cách có thể trích xuất các tệp cụ thể từ một kho lưu trữ. Cụ thể GNU tar có thể được sử dụng để trích xuất một hoặc nhiều tệp từ tarball. Để trích xuất các thành viên lưu trữ cụ thể, hãy đặt tên thành viên chính xác của họ làm đối số.

Ví dụ:

tar --extract --file={tarball.tar} {file}

Bạn cũng có thể trích xuất các tệp phù hợp với một mẫu hình cầu cụ thể (ký tự đại diện). Ví dụ: để trích xuất từ ​​cbz.tar tất cả các tệp bắt đầu bằng pic, bất kể tiền tố thư mục của chúng, bạn có thể nhập:

tar -xf cbz.tar --wildcards --no-anchored 'pic*'

Để giải nén tất cả các tệp php, nhập:

tar -xf cbz.tar --wildcards --no-anchored '*.php'

Ở đâu,

-x: hướng dẫn tar để giải nén tập tin.
-f: chỉ định tên tệp / tên tarball.
-v: Verbose (hiển thị tiến trình trong khi giải nén tập tin).
-j: bộ lọc lưu trữ thông qua bzip2, sử dụng để giải nén các tập tin .bz2.
-z: bộ lọc lưu trữ thông qua gzip, sử dụng để giải nén các tập tin .gz.
--wildcards: hướng dẫn tar để coi các đối số dòng lệnh như các mẫu hình cầu.
--no-anchored: thông báo cho nó rằng các mẫu áp dụng cho tên thành viên sau bất kỳ / dấu phân cách.


3
Tôi không muốn giải nén các tập tin cụ thể. Tôi chỉ muốn trích xuất 50 tệp đầu tiên vì tôi không biết tên của các tệp đó là gì.
Pieter van Niekerk

4
Bạn có thể lấy danh sách tên tệp bằng cách sử dụng "tar -tf", lấy 50 đầu tiên bằng cách sử dụng "đầu", sau đó đưa danh sách đó vào một lệnh tar khác làm danh sách tên tệp cần trích xuất. Như thế này: "tar -xf file.tar --no-anchor` tar -tf file.tar | head -50`"
Simon Hibbs

Hoàn toàn có thể (trong thử nghiệm của tôi) để trích xuất tệp thứ 50 bị xử lý một phần .. Sẽ là một ý tưởng tốt để tránh trích xuất tệp cuối cùng (hiện tại) trong -tdanh sách cho đến khi tarball được tải xuống đầy đủ. Tại bất kỳ thời điểm nào, danh sách chỉ hiển thị tên tệp đã hoặc đang được chuyển, tức là. không phải là danh sách đầy đủ ; cho đến khi nó được tải xuống đầy đủ
Peter.O

2

Tôi đã không thử điều này bản thân mình, nhưng làm thế nào về điều này:

tar xvf archive.tar | head -n50

Tar xuất một dòng thành STDOUT cho mỗi tệp được trích xuất, sau đó headlệnh sẽ giết đường ống sau 50 dòng. Khi đường ống chết, tôi cũng mong tar sẽ chết.


Xin lỗi, điều đó tất nhiên phải là a head. Hãy để tôi thay đổi câu trả lời của tôi.
jippie

Tôi chưa kiểm tra, nhưng tôi sợ rằng do bộ đệm ống, tarcó thể trích xuất hơn 50 tệp trước khi SIGPIPEd và đặc biệt là nó có thể trích xuất tệp cuối cùng, chưa hoàn chỉnh.
Gilles 'SO- ngừng trở nên xấu xa'

2
tar -tvf tarfile.tar

cung cấp cho bạn toàn bộ danh sách các tập tin trong tarfile.tar

tar -xvf tarfile.tar fileToRestore  

Lệnh này khôi phục lại fileToRestore

Để gỡ bỏ nhiều tệp, nhưng không phải tất cả chúng đều có thể:

  • Bạn đặt tất cả danh sách tập tin từ tarfile.tarvàotar.txt

    tar -tvf tarfile.tar > tar.txt
    
  • Bây giờ tar.txtcó toàn bộ danh sách các tệp trong tarfile.tar và bạn chỉ có thể để lại các tệp bạn muốn khôi phục hoặc với đầu ...

    head -n50 tar.txt > tar2.txt
    

Bạn có thể đặt những dòng này vào một tập tin

cat tar.txt|while read line
do
   tar -xvf tarfile.tar ${line}
done

Hoặc tệp tập lệnh hoàn chỉnh:

#!/bin/bash

if [[ "$1" = "" || "$2" = "" ]]
   then
   echo ""
   echo "Uso: untar-list.sh tarfile.tar listfile.txt"
   echo ""
   exit 1
fi

tarfile=$1
file=$2

if [[ ! -f ${tarfile} ]]
   then
   echo ""
   echo "Archivo ${tarfile} no existe"
   echo ""
   exit 1
fi

if [[ ! -f ${file} ]]
   then
   echo ""
   echo "Archivo ${file} no existe"
   echo ""
   exit 1
fi

cat ${file}|while read line
do
  tar -xvf ${tarfile} ${line}
done

echo ""
echo "Finalizado"
echo ""

Và đó là tất cả


2
Điều đó phải rất chậm để gọi lệnh tar trong một vòng lặp. Nó đọc toàn bộ tập tin mỗi lần, phải không?
swdev
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.