Как архивировать только указанные файлы с помощью подстановочного знака?

Вы уже знаете о -v variable=value. Другой способ — передать переменные через окружение и прочитать их из массива ENVIRON:

$ var1=hello var2=world awk 'BEGIN { print ENVIRON["var1"], ENVIRON["var2"] }'
hello world

Это устанавливает переменные среды var1и var2только в среде awk.

Или,

$ export var1=hello var2=world
$ awk 'BEGIN { print ENVIRON["var1"], ENVIRON["var2"] }'
hello world

Это устанавливает переменные в вызывающей среде перед вызовом awk.

Массив ARGVсодержит только имена файлов, из которых программа awkбудет последовательно читать, но он также может содержать имена переменных, заданные в командной строке, как в

awk '...' var1=value1 var2=value2 filename

Как правило, это не рекомендуемый способ передачи переменных в awkхотя (эти переменные не будут доступны в блоке BEGIN, например ).

2
29.07.2020, 11:01
2 ответа

Как насчет:

$ tar czf ~/files.tgz -T <(\ls -1 $des/bin/*.{c,h}pp)

tarобрабатывает содержимое файла после флага -Tкак файлы, подлежащие архивации, по одному в строке. Это работает на GNU tar1.32.

Синтаксис <(cmd), где cmdозначает \ls -1 $des/bin/*.{c,h}pp, называется подстановкой процесса(для получения дополнительной информации см. man bash).

РЕДАКТИРОВАТЬ:если вам нужно, чтобы имена файлов не были полностью определенными (чтобы не включать их абсолютные пути )в ваш tar-шар, просто cdв нужный каталог перед запуском команды tar...

$ cd $des/bin; tar czf ~/files.tgz -T <(\ls -1 *.{c,h}pp)

ОБРАТИТЕ ВНИМАНИЕ, что указание интересующей директории с флагом -C:

$ tar czf ~/files.tgz -C $des/bin -T <(\ls -1 *.{c,h}pp)

не работает . Хотя флаг -Cчувствителен к порядку -, т. е. влияет на все последующие флаги, он не применяется к подстановке процесса, как показано.

1
18.03.2021, 23:16

шарики расширяются оболочкой.tar(по крайней мере некоторые tarреализации )поддерживают подстановочные знаки, но только для фильтрации файлов для извлечения или перечисления из архива.

Итак, список файлов должен быть сгенерирован оболочкой, и если вам нужно, чтобы имена файлов, хранящиеся в архиве, не имели компонента каталога, вам нужно либо tar, чтобы удалить его, (, у некоторых есть -sили --transformдля этого ), или просто cdв этот каталог перед созданием списка файлов.

Чтобы оставить выходной архив в исходном рабочем каталоге,вы можете использовать перенаправление и менять каталог только в подоболочке, как в:

(cd -P -- "$des/bin" && tar -zcvf - -- *.[hc]pp) > files.tar.gz

Или вы можете записать этот каталог перед изменением текущего рабочего каталога:

(dir=$PWD; cd -P -- "$des/bin" && tar -zcvf "$dir/files.tar.fz" -- *.[hc]pp)
3
18.03.2021, 23:16

Теги

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