Eu preciso criar um arquivo de um diretório usandotar
em um script de shellmas também devo excluir arquivos ocultos e arquivos cujo tamanho seja igual a 0
. Além disso, o primeiro argumento da linha de comando é a localização do arquivo que deve ser criado, o segundo é o nome do arquivo e o terceiro é o caminho para o diretório cujos arquivos devem ser arquivados.
Tentei enviar os argumentos assim no meu terminal:
/bin/bash ss1 /home/user arch /home/user/folder
Mas isso está me causando alguns erros de tar. Tentei arquivar assim:
tar -cvf --exclude=.* $1/$2 $3
Mas não está correto e não tenho certeza de qual seria a sintaxe correta para isso e também como excluiria arquivos vazios e ocultos.
Responder1
Já que você marcou isso, linux
presumo que você tenha GNU find
e GNU tar
.
Se seus nomes de arquivos não tiverem novas linhas incorporadas e você não quiser arquivar diretórios vazios:
find "$3" -type f \! -empty \! -name '.*' | tar cvf "$1/$2" -T -
find
encontra os arquivos relevantes e -T -
diz tar
para ler a lista de arquivos para arquivar stdin
.
Refinando isso, se você quiser incluir diretórios vazios:
find "$3" \( -type d -empty \) -o \( -type f \! -empty \! -name '.*' \) | \
tar cvf "$1/$2" -T -
E se vocêtambémdeseja lidar com nomes de arquivos com novas linhas incorporadas:
find "$3" \( \( -type d -empty \) -o \( -type f \! -empty \! -name '.*' \) \) -print0 | \
tar cvf "$1/$2" --null -T -
Responder2
Experimente isto:
find test/ -not -iname ".*" -not -empty -exec tar --no-recursion -rvf file.tar {} \;
O único problema é que diretórios vazios não serão incluídos, mas acho que há alguma solução alternativa em algum lugar...