как переименовать файлы, которые вы вставляете в архив tar, используя linux 'tar'

Я пытаюсь создать tar-архив с несколькими файлами, но переименуйте эти файлы в архив. Прямо сейчас у меня есть что-то вроде этого:

tar -czvf file1 /some/path/to/file2 file3 etc

Но я хотел бы сделать что-то вроде:

tar -czvf file1=file1 /some/path/to/file2=file2 file3=path/to/renamedFile3 etc=etc

Где, когда вы извлечены в каталог testDir, вы увидите файлы:

  • testDir/file1
  • testDir/file2
  • testDir/путь/к /renamedFile3
  • testDir/и т.д.

Как я могу это сделать?

Ответ 1

Вы можете изменять имена файлов (между прочим) с помощью --transform. Например, чтобы создать ленточный архив /tmp/foo.tar, поместив в него файлы /etc/profile и /etc/bash.bashrc а также переименовав profile в foo, вы можете сделать следующее:

tar --transform='flags=r;s|bar|foo|' -cf file.tar file1 file2 bar fubar /dir/*

Результаты вышесказанного file.tar в том, что bar добавляется в file.tar как foo.

Флаг r означает, что преобразования применяются только к обычным файлам. Для получения дополнительной информации см. Документацию GNU tar.

Вы можете использовать --transform несколько раз, например:

tar --transform='flags=r;s|foo|bar|' --transform='flags=r;s|baz|woz|' -cf file.tar /some/dir/where/foo/is /some/dir/where/baz/is /other/stuff/* /dir/too

Ответ 2

С --transform нет необходимости делать временный testDir. Чтобы добавить testDir/ ко всему архиву, сопоставьте начальный якорь ^:

tar --transform "s|file3|path/to/renamedFile3|" \
    --transform "flags=r;s|^|testDir/|" \
    -czvf my_archive.tgz file1 /some/path/to/file2 file3 etc

Флаг r имеет решающее значение, чтобы заставить трансформацию нарушать любые цели символической ссылки в архиве (которые также соответствуют ^).

Ответ 3

Мы можем ссылаться на man tar, опция -O - лучший выбор, поскольку файлы могут быть записаны в стандартную -O.

-O      (x, t modes only) In extract (-x) mode, files will be written to
         standard out rather than being extracted to disk.  In list (-t)
         mode, the file listing will be written to stderr rather than the
         usual stdout.

вот примеры:

# 1. without -O
tar xzf 20170511162930.db.tar.gz
# result: 20170511162930.db

# 2. with -O
tar xzf 20170511162930.db.tar.gz -O > latest.db
# result: latest.db

Ответ 4

После того, как мне не понравилось какое-либо решение, которое я нашел, я только что написал tarlogs.py, который позволяет указать произвольные имена для записей tar. Каждая запись tar создается из одного (или нескольких) регулярных (или gzipped) входов. Вы также можете добавить каталоги, которые будут повторяться так же, как и с обычным tar. Так что в вашем случае,

tarlogs.py -o file1 -i /some/path/to/file2 -o file2 -i file3 -o path/to/renamedFile3 -o /etc >output.tar

(-o без входов -i просто использует выходной путь как вход, без переименования)