извлекать и удалять файлы из одного tar и добавлять в другой новый - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть bzip2 ed tar-файл и текстовый файл со списком файлов. Я хочу извлечь файлы, перечисленные в текстовом файле из tar, добавить их в новый tar, а затем удалить их из первого tar.

Например, если у меня есть tar-файл, подобный этому:

$ tar -tvf test.tar.bz2
drwxrwxrwx nacho/nacho       0 2018-11-16 23:30 one/test/
-rw-rw-rw- nacho/nacho       0 2018-11-16 23:25 one/test/a
-rw-rw-rw- nacho/nacho       0 2018-11-16 23:25 one/test/b
drwxrwxrwx nacho/nacho       0 2018-11-16 23:25 one/test/c/
-rw-rw-rw- nacho/nacho       0 2018-11-16 23:25 one/test/c/a
-rw-rw-rw- nacho/nacho       0 2018-11-16 23:25 one/test/c/b
drwxrwxrwx nacho/nacho       0 2018-11-16 23:25 one/test/c/c/
-rw-rw-rw- nacho/nacho       0 2018-11-16 23:25 one/test/c/c/a
-rw-rw-rw- nacho/nacho       0 2018-11-16 23:25 one/test/c/c/b
drwxrwxrwx nacho/nacho       0 2018-11-16 23:25 one/test/c/d/
-rw-rw-rw- nacho/nacho       0 2018-11-16 23:25 one/test/c/d/a
-rw-rw-rw- nacho/nacho       0 2018-11-16 23:25 one/test/c/d/b
drwxrwxrwx nacho/nacho       0 2018-11-16 23:34 one/test/e/

И текстовый файл со списком таких файлов:

$ cat files_to_extract
one/test/b
one/test/e/
one/test/c/b
one/test/c/d/a

После того, как это сделано, вот как должен выглядеть оригинальный tar-файл:

$ tar -tvf test.tar.bz2
drwxrwxrwx nacho/nacho       0 2018-11-16 23:30 one/test/
-rw-rw-rw- nacho/nacho       0 2018-11-16 23:25 one/test/a
drwxrwxrwx nacho/nacho       0 2018-11-16 23:25 one/test/c/
-rw-rw-rw- nacho/nacho       0 2018-11-16 23:25 one/test/c/a
drwxrwxrwx nacho/nacho       0 2018-11-16 23:25 one/test/c/c/
-rw-rw-rw- nacho/nacho       0 2018-11-16 23:25 one/test/c/c/a
-rw-rw-rw- nacho/nacho       0 2018-11-16 23:25 one/test/c/c/b
drwxrwxrwx nacho/nacho       0 2018-11-16 23:25 one/test/c/d/
-rw-rw-rw- nacho/nacho       0 2018-11-16 23:25 one/test/c/d/b

И как должен выглядеть новый tar-файл.

$ tar -tvf new.tar.bz2
-rw-rw-rw- nacho/nacho       0 2018-11-16 23:25 one/test/b
-rw-rw-rw- nacho/nacho       0 2018-11-16 23:25 one/test/c/b
drwxrwxrwx nacho/nacho       0 2018-11-16 23:34 one/test/e/
-rw-rw-rw- nacho/nacho       0 2018-11-16 23:25 one/test/c/d/a

Обратите внимание, порядок файлов не имеет значения.

Ответы [ 2 ]

0 голосов
/ 12 августа 2019

Вот как я это сделал:

Извлечение файлов из "files_to_extract" в стандартный вывод и передача в другой tar:

tar -xOjf test.tar.bz2 -T files_to_extract | tar -cjf new.tar.bz2 -T -

Распакуйте, удалите из tar и снова разархивируйте в bzip:

bunzip2 test.tar.bz2
tar -f test.tar --delete $(cat files_to_extract)
bzip2 test.tar

Необычная документация опций:

0 голосов
/ 17 ноября 2018

С GNU tar:

# unpack test.tar.bz2 to test.tar
bunzip2 test.tar.bz2

# create a working directory
mkdir tempdir

# extract desired files to tempdir
tar -C tempdir -xvf test.tar --files-from files_to_extract

# create new tar.bz2 with desired files in tempdir
tar -C tempdir -cvjf new.tar.bz2 one

# check content of new.tar.bz2
tar -tjf new.tar.bz2 

Вывод последней команды:

one/
one/test/
one/test/c/
one/test/c/b
one/test/c/d/
one/test/c/d/a
one/test/e/
one/test/b
# remove directory tempdir in current directory
rm -rf tempdir

# remove files in test.tar listed in files_to_extract 
tar --delete -vf test.tar --files-from files_to_extract

# pack test.tar to test.tar.bz2
bzip2 test.tar

# check content of test.tar.bz2
tar -tjf test.tar.bz2

Вывод последней команды:

one/
one/test/
one/test/c/
one/test/c/c/
one/test/c/c/a
one/test/c/c/b
one/test/c/a
one/test/c/d/
one/test/c/d/b
one/test/a
...