Создание файла cpio с другим абсолютным каталогом

Я установил переменную $TERM добавление строки XTerm*termName: xterm-256color в мой.Xresources файл.

Это прекрасно, пока Вы знаете о том, что Вы сделали; большинство терминалов GUI поддерживает это.

Можно также установить его из командной строки или в сценарии

export TERM=xterm-256color

Это только относится к тому терминалу или последующим детям.

Портативное значение по умолчанию было бы справедливо xterm, что означает 16 цветной поддержки. Если у Вас будет 256 наборов цветов, и Ваш терминал не поддерживает их, то запущение 256 цветных приложений TUI будет просто выглядеть странным; Вы, вероятно, заметите сразу же. Но это не должно быть опасно.

2
25.06.2015, 20:04
2 ответа

Используйте pax и его параметр -s , чтобы переименовывать файлы по мере их добавления в архив. Pax является заменой POSIX традиционных утилит tar и cpio ; некоторые дистрибутивы Linux не устанавливают его по умолчанию, но он всегда должен быть доступен в виде пакета.

pax -w -x cpio -s '~^[/]*~~' root-directory >archive.cpio
1
27.01.2020, 22:00

Если у вас есть python и:

  • установите libarchive-c (например, используя pip install libarchive-c )
  • поместите все ваши файлы в каталог root в текущем каталоге (я использовал
    mkdir -p root / xyz; echo 1> root / abc.txt; echo 2> root / xyz / def.txt )
  • сохраните следующее как abscpio и сделайте его исполняемым ( chmod 755 abscpio )

     #! / usr / bin / env python 
    import os 
    import sys 
    from libarchive import ffi 
    from libarchive.write import (
    new_archive_write, ArchiveWrite, new_archive_read_disk) 
    из libarchive.entry импортировать new_archive_entry, ArchiveEntry 
    из libarchive.ffi import (
    ARCHIVE_EOF, 
    entry_sourcepath, 
    entry_clear, 
    read_next_header2, 
    read_disk_descend, 
    write_header, 
    write_data, 
    write_finish_entry, 
    ) 
     
     
    class AbsArchiveWrite (ArchiveWrite): 
     
    def add_abs_file (self , path, store_path): 
     "" "Прочитать указанные пути с диска и добавить их в архив. 
    " "" 
    write_p = self._pointer 
     
    block_size = ffi.write_get_bytes_per_block (write_p) 
    if block_size <= 0: 
    block_size = 10240 # pragma: no cover 
     
    with new_archive_entry ( ) как entry_p: 
    entry = ArchiveEntry (None, entry_p) 
    с new_archive_read_disk (путь) как read_p: 
    , а 1: 
    r = read_next_header2 (read_p, entry_p ) 
    if r == ARCHIVE_EOF: 
    break 
    entry.pathname = store_path 
    read_disk_descend (read_p) 
    write_header (write_p, entry_p) {{ 1}} попробуйте: 
    с open (entry_sourcepath (entry_p), 'rb') как f: 
    , а 1: 
    data = f.read (block_size) {{1} } если не данные: 
    break 
    write_data (write_p, data, len (data)) 
    кроме IOError как e: 
    if e.errno! = 21: 
    raise # pragma: no cover 
    write_finish_entry (write_p) 
    entry_clear (entry_p) 
    если os.path.isdir (путь): 
    break 
     
     
    base_dir = sys.argv [2] 
     
    с new_archive_write ('cpio', None) как archive_p: 
    ffi.write_open_filename_w (archive_p, sys.argv [1]) {{1 }} a = AbsArchiveWrite (archive_p) 
     
    для root, dir_names, file_names в os.walk (base_dir): 
    для dir_name в dir_names: 
    full_name = os .path.join (root, dir_name) 
    a.add_abs_file (full_name, full_name.replace (base_dir, '/', 1)) 
    для file_name в file_names: 
    full_name = os.path.join (root, file_name) 
    a.add_abs_file (full_name, full_name.replace (base_dir, '/', 1)) 
     
    print '---- - листинг '+ sys.argv [1] 
    os.system (' cpio -itv -I '+ sys.argv [1]) 
     

вы можете сделать:

abscpio my_arch.cpio root/

с выводом чего-то вроде:

----- listing my_arch.cpio
drwxrwxr-x   2 anthon   users           0 Jun 25 18:59 /xyz
-rw-rw-r--   1 anthon   users           2 Jun 25 18:59 /abc.txt
-rw-rw-r--   1 anthon   users           0 Jun 25 18:59 /xyz/def.txt

для производства вы можете удалить последние две строки из скрипта.

Ссылки тоже сохраняются, но я не пробовал другие типы "файлов".

3
27.01.2020, 22:00

Теги

Похожие вопросы