как мне указать tar исключить только каталог вне корня, но не каталог с тем же именем глубже в дереве?

Будьте осторожны: что если вы удалите часть файла, а процесс прервется на середине?

Дисковое пространство стоит дешево, поэтому вряд ли есть смысл пытаться сэкономить место на диске таким образом.

Если вам действительно нужно это сделать, я рекомендую обрабатывать файл по частям. Возьмите фрагмент, зашифруйте его, затем удалите эту часть исходного файла. Затем обработайте следующий фрагмент и так далее. Таким образом, если процесс прервется, вы сможете удалить незаконченный зашифрованный фрагмент и возобновить процесс. При таком подходе проще обрабатывать файл от конца к началу.

Предупреждение: непроверенный код. Предполагает использование утилит GNU или BusyBox (например, Linux) и 64-битной оболочки (для работы с файлами размером более 2 ГБ).

#!/bin/sh
set -e
input_size=$(stat -c %s myfile)
fragment_size=$((1024*1024*1024))
while [ "$input_size" -gt 0 ]; do
  chunk_size=$((input_size % fragment_size)) || chunk_size=$fragment_size
  input_size=$((input_size - fragment_size))
  fragment_name=$(printf fragment-%08d "$((input_size / fragment_size))")
  tail -c "$((input_size+1))" myfile | gpg -e >"$fragment_name.gpg.tmp"
  mv "$fragment_name.gpg.tmp" "$fragment_name.gpg"
  truncate -s "$input_size" myfile
done
2
21.10.2016, 00:18
3 ответа

Вы можете использовать find для создания своих аргументов - хотя и немного длинновато:

 find -mindepth 1 ! -wholename './config' ! -wholename './config/*'

mindepth 1 , чтобы исключить ]. и два исключения полное имя для самого каталога, а также его содержимого.

tar -xzf deploy/deploy.gz --exclude="deploy" \
$( find -mindepth 1 ! -wholename './config' ! -wholename './config/*' )
1
27.01.2020, 22:19

Не забудьте указать параметры - exclude перед аргументами источника, назначения

tar --exclude=deploy --exclude="./config" -cvz deploy/deploy.gz .
0
27.01.2020, 22:19

С этим скелетным деревом каталогов:

mkdir -p src config dist/config

GNU tar, похоже, делает то, что вы хотите, если вы используете - exclude = "./ config" (без косой черты в конце):

$ tar --version
tar (GNU tar) 1.27.1
$ tar cf - --exclude="./config" ./* | tar tf -
./dist/
./dist/config/
./src/

Однако, tar в моей OS X ( bsdtar 2.8.3 - libarchive 2.8.3 ), похоже, сбрасывает обе копии config с той же командной строкой.

Итак, одним из способов обойти это, кажется, является использование GNU tar. :)

Другой вариант - сделать архив на один уровень каталогов выше и включить в него каталог верхнего уровня (как это обычно бывает с программным обеспечением Unix), чтобы мы могли использовать его имя в exclude :

$ cd ..
$ tar cf - --exclude="dir/config" dir/* | tar tf -
dir/dist/
dir/dist/config/
dir/src/

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

$ shopt -s extglob
$ tar cf - ./!(config)  | tar tf -
./dist/
./dist/config/
./src/

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

0
27.01.2020, 22:19

Теги

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