Распаковка с использованием tar: --exclude too greedy: как исключить только файл корневого уровня?

Поиск int или unsigned int и последующее исключение всего найденного, содержащего = , указывающее на то, что инициализируется, похоже, он должен выполнить свою работу.

grep -E '^int|^unsigned int' myfile.txt | grep -Ev '='
2
28.03.2016, 17:11
3 ответа

Фактически, tar может исключать файлы с - привязанными

шаблоны соответствуют имени файла start

Но затем вам нужно записать полный путь к файлу (который также изменяется с cd ):

$ cd /where/source/lives
$ tar -cf master.zip --anchored --exclude={source/install.sh,README.md} -- *

Если вам нужна некоторая гибкость, используйте find.
Список файлов для сжатия можно создать с помощью этой команды
! -name README.md отклоняет базовый файл README.md :

$ path="/path/to/files"
$ find "$path/" ! -path  "$path"/README.md -print

Будьте осторожны с косыми чертами / , они имеют значение. Если он содержит правильный список файлов для сжатия, затем просто введите его в tar (добавьте 0 в -print и создайте команду tar ):

find "$path/" ! -path  "$path"/README.md -print0 |
tar --no-recursion --null -T- --exclude=install.sh -v -cf master.zip

Обратите внимание, что tar использует параметр - null для сопоставления с -print0 из find .

Поскольку find предоставляет всю необходимую рекурсию, используйте параметр tar - без рекурсии .

Кроме того, файл install.sh по-прежнему исключен из tar (который также мог быть удален с помощью find , но это только личное предпочтение).

В процессе эксплуатации удалите параметр -v , чтобы получить менее подробную команду tar.


Чтобы распаковать (вместо сжатия, как указано выше), используйте следующее:

tar -xf master.zip --anchored --exclude={source/install.sh,README.md}

Или, если вы используете второй вариант для создания сжатого файла, исключенные файлы не будут внутри master.zip и все, что вам нужно сделать, это:

tar -xf master.zip    
3
27.01.2020, 21:54

Кто-то может предложить лучший ответ, но если параметр tar - exclude не сокращает его, вы можете использовать find , чтобы сгенерировать список файлов, а затем подать что tar . Например:

find * -path README.md -prune -o -print | 
tar --no-recursion -cf /tmp/data.tar -T-

Это распечатывает список всех файлов (и каталогов), не относящихся к верхнему уровню README.md , а затем передает их в tar , который читает его список файлов из stdin (с использованием -T- ). Флаг - без рекурсии необходим, потому что в противном случае tar автоматически включит все файлы в каталогах, которые вам не нужны, потому что эти файлы также будут созданы с помощью find , и в результате в архиве останется несколько файлов с одинаковым именем.

Более надежная версия может выглядеть так:

find * -path README.md -prune -o -print0 | 
tar --no-recursion -cf /tmp/data.tar --null -T-

Здесь -print0 to find и - null to tar означает, что имена файлов будут разделены символами ASCII NUL, а не пробелами, что означает, что конвейер будет обрабатывать имена файлов, содержащие пробелы.

2
27.01.2020, 21:54

Утилита pax имеет функцию исключения, которая немного шире, чем BSD tar. Ее опция -s позволяет преобразовывать имена при их сохранении или извлечении, и если имя преобразуется в пустую строку, файл исключается.

(BSD tar имеет несколько похожую опцию -s, но, судя по документации, она не имеет функции исключения на пустом месте.)

zcat foo.tar.gz | pax -r -pe -s'!^README\.md$!!' -s'!^\./README\.md$!!'

Обратите внимание, что я предполагаю (возможно, сжатый) tar-файл. Если у вас zip-файл, используйте unzip вместо этого.

unzip foo.zip -x 'README.md'
1
27.01.2020, 21:54

Теги

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