Com essa árvore de diretórios de esqueleto:
mkdir -p src config dist/config
O GNU tar parece fazer o que você deseja se você usar --exclude="./config"
(sem a barra final):
$ tar --version
tar (GNU tar) 1.27.1
$ tar cf - --exclude="./config" ./* | tar tf -
./dist/
./dist/config/
./src/
No entanto, o tar
no meu OS X ( bsdtar 2.8.3 - libarchive 2.8.3
) parece eliminar ambas as cópias de config
com a mesma linha de comando.
Portanto, uma maneira de contornar isso parece usar o tar GNU. :)
Outra seria tornar o arquivo um nível de diretório mais alto e incluir o diretório de nível superior nele (como é habitual no software Unix), para que possamos usar seu nome no exclude
:
$ cd ..
$ tar cf - --exclude="dir/config" dir/* | tar tf -
dir/dist/
dir/dist/config/
dir/src/
Ou, se você tiver um shell compatível, use extglob
para corresponder a tudo, menos ao único nome:
$ shopt -s extglob
$ tar cf - ./!(config) | tar tf -
./dist/
./dist/config/
./src/
Ou use qualquer outra forma de remover um item da lista de nomes de arquivos, que deve ser simples se você souber que seus nomes de arquivo de nível superior não contêm nada mais especial do que alfanuméricos (especialmente nenhum espaço em branco).