Мне нужно создать архив каталога с помощьюtar
в скрипте оболочкино я также должен исключить скрытые файлы и файлы, размер которых равен 0
. Также первый аргумент командной строки — это местоположение архива, который предполагается создать, второй — имя архива, а третий — путь к каталогу, файлы которого предполагается архивировать.
Я попробовал отправить аргументы в своем терминале следующим образом:
/bin/bash ss1 /home/user arch /home/user/folder
Но он выдает мне некоторые ошибки tar. Я пробовал архивировать так:
tar -cvf --exclude=.* $1/$2 $3
Но это неправильно, и я не уверен, какой синтаксис будет правильным для этого, а также как исключить пустые и скрытые файлы.
решение1
Поскольку вы отметили это, linux
я предполагаю, что у вас есть GNU find
и GNU tar
.
Если имена ваших файлов не содержат встроенных символов новой строки и вы не хотите архивировать пустые каталоги:
find "$3" -type f \! -empty \! -name '.*' | tar cvf "$1/$2" -T -
find
находит соответствующие файлы и -T -
просит tar
прочитать список файлов для архивации stdin
.
Уточним это, если вы хотите включить пустые каталоги:
find "$3" \( -type d -empty \) -o \( -type f \! -empty \! -name '.*' \) | \
tar cvf "$1/$2" -T -
И если вытакжехотите обрабатывать имена файлов со встроенными символами новой строки:
find "$3" \( \( -type d -empty \) -o \( -type f \! -empty \! -name '.*' \) \) -print0 | \
tar cvf "$1/$2" --null -T -
решение2
Попробуй это:
find test/ -not -iname ".*" -not -empty -exec tar --no-recursion -rvf file.tar {} \;
Единственная проблема в том, что пустые каталоги не будут включены, но я думаю, что есть какой-то обходной путь...