как переименовать файлы, которые вы помещаете в архив 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 была/файл1
  • testdir была/файл2
  • testDir / путь / к / renamedFile3
  • testDir / etc

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

4 ответов


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

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

результаты вышеизложенного, что bar добавляется file.tar as 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

С --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 флаг имеет решающее значение для сохранения преобразования от взлома любых целей символической ссылки в архиве (которые также соответствуют ^).


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

-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

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

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

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