исключить пустые и скрытые файлы при архивации

исключить пустые и скрытые файлы при архивации

Мне нужно создать архив каталога с помощью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 {} \;

Единственная проблема в том, что пустые каталоги не будут включены, но я думаю, что есть какой-то обходной путь...

Связанный контент