Se você usar o gnu tar, você pode editar os nomes dos arquivos no caminho para o tar:
$ mkdir -p a/b
$ cd a
$ tar cf - --transform='s:^./::' . | tar tvf -
drwxr-xr-x 0 2018-07-24 18:18 ./
drwxr-xr-x 0 2018-07-24 18:18 b/
Eu tenho vários scripts que executam e coletam dados que são então alimentados em outros scripts. Então toda essa cadeia é automatizada. Em um ponto da automação, todos os arquivos de dados são bloqueados para serem enviados para processamento. O comando que estou usando é este:
tar -zchvf "$target_dir" -C "$data_dir" .
Onde target_dir é onde meu tarball está indo e data_dir é onde meus dados estão localizados.
Agora isso está funcionando bem; no entanto, os arquivos no meu tarball são assim:
./file1
./file2
<etc>
O script de pós-processamento está bagunçado por causa do ./ nesses arquivos. Espera que eles sejam assim:
file1
file2
<etc>
Eu olhei para a página de manual e nada realmente me destaca para remover o líder ./ no processo de alcatrão. Uma coisa que eu estava pensando em fazer era mudar o roteiro para o seguinte ...
cd $data_dir; tar -zchvf "$target" *; cd -
mas isso parece muito errado para mim e eu acredito que há algo mais idiota que estou perdendo.
Estou usando o bash v3.2.5 como referência.
Se você usar o gnu tar, você pode editar os nomes dos arquivos no caminho para o tar:
$ mkdir -p a/b
$ cd a
$ tar cf - --transform='s:^./::' . | tar tvf -
drwxr-xr-x 0 2018-07-24 18:18 ./
drwxr-xr-x 0 2018-07-24 18:18 b/
Lendo a documentação de tar 1.15.1
, lançada em 2004-12-21, do link de download link está incluído tar.info
para ter certeza:
6.3 Reading Names from a File
[...]--files-from=FILE NAME' '-T FILE NAME' Get names to extract or create from file FILE NAME.
If you give a single dash as a file name for '
--files-from
', (i.e., you specify either '--files-from=-
' or '-T -
'), then the file names are read from standard input.
Agora para ls
, parte de coreutils
, lendo coreutil.info
de coreutils-5.0
de 2003-04-02 ( link ), antes de tar 1.15.1
:
'
-A
'
'--almost-all
'
List all files in directories except for '.
' and '..
'.
Portanto, isso deve funcionar como desejado (parênteses estão lá para esquecer o cd
, você provavelmente poderia fazer cd -
ou simplesmente não se importar):
( cd "$data_dir" && ls -A | tar -zchvf "$target_file" -T - )