Зняти лише певну кількість файлів з великого тарболу


12

У мене є великий тарбол, який зайнятий переходом FTP від ​​віддаленої до нашої локальної системи.

Я хочу знати, чи можна запустити untarring, щоб сказати 50 файлів одночасно, щоб ці файли могли почати оброблятися під час передачі.

Відповіді:


12

Ось детальне пояснення того, як можна витягти конкретні файли з архіву. Зокрема, гугл GNU може використовуватися для вилучення одного або декількох файлів із тарболу. Для вилучення конкретних членів архіву вкажіть їхні точні імена членів як аргументи.

Наприклад:

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

Ви також можете витягти ті файли, які відповідають певному шаблону глобусу (символи підстановки). Наприклад, щоб витягти з cbz.tar всі файли, які починаються з pic, незалежно від їх префіксу каталогу, ви можете ввести:

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

Щоб витягнути всі файли php, введіть:

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

Де,

-x: доручає tar витягувати файли.
-f: вказує ім'я файлу / тарбол.
-v: Докладний (показує хід під час вилучення файлів).
-j: фільтруйте архів через bzip2, використовуйте для розпакування файлів .bz2.
-z: фільтрувати архів через gzip, використовувати для розпакування файлів .gz.
--wildcards: доручає tar розглянути аргументи командного рядка як шаблони глобалізації.
--no-anchored: повідомляє, що шаблони застосовуються до імен членів після будь-якого / роздільника.


3
Я не хочу витягувати конкретні файли. Я просто хочу витягнути перші 50 файлів, оскільки я не знаю, як називаються файли.
Пітер ван Нікерк

4
Ви можете отримати список імен файлів за допомогою "tar -tf", взяти перші 50 за допомогою "head", а потім подати цей список в іншу команду tar як список файлів для вилучення. Ось так: "tar -xf file.tar - no-anchred` tar -tf file.tar | head -50` "
Simon Hibbs

Цілком можливо (на моєму тестуванні) витягти частково переданий 50-й файл. Було б непоганою ідеєю уникати вилучення (поточного) останнього файлу у -tсписку до повного завантаження тарболу. У будь-який момент часу у списку відображаються лише імена файлів, які були або передані, або передані, тобто. не повний список; до повного завантаження.
Пітер.О

2

Я сам не пробував цього, але як щодо цього:

tar xvf archive.tar | head -n50

Тар видає рядок STDOUT для кожного вилученого файлу, тоді headкоманда знищить трубу через 50 рядків. Після вмирання труби я би очікував, що дьоготь теж помре.


Вибачте, це, звичайно, повинно було бути head. Дозвольте мені змінити свою відповідь.
jippie

Я не перевіряв, але tarпобоююсь, що завдяки буфері труби може витягнути більше 50 файлів до того, як стане SIGPIPEd, і, зокрема, він може витягти останній, неповний файл.
Жил 'ТАК - перестань бути злим'

2
tar -tvf tarfile.tar

дає вам весь список файлів у tarfile.tar

tar -xvf tarfile.tar fileToRestore  

Ця команда відновлює fileToRestore

Для вилучення декількох файлів, але не всіх ви можете:

  • Ви вміщуєте весь список файлів tarfile.tarуtar.txt

    tar -tvf tarfile.tar > tar.txt
    
  • Тепер tar.txtє весь список файлів, tarfile.tar і ви можете залишити лише ті файли, які ви хочете відновити, або з головою ...

    head -n50 tar.txt > tar2.txt
    

Ви можете помістити ці рядки у файл

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

Або повний файл сценарію:

#!/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 ""

І це все


2
Це повинно бути болісно повільним, щоб викликати команду tar в циклі. Він щоразу читає весь файл, правда?
swdev
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.