Como tarar várias pastas, algumas recursivamente, outras não recursivamente

Como tarar várias pastas, algumas recursivamente, outras não recursivamente

Eu tenho uma lista de diretórios. Alguns dos diretórios exigem que eles sejam tarados recursivamente, outros exigem apenas o arquivo que existe nesse diretório, sem subdiretórios: Usando o diretório/arquivos abaixo como exemplo, como seria meu comando tar:

/tmp/dir1/ - Recursively
/tmp/dir2/ - Only the files that exist in that directory, no subdirectories
/tmp/dir3/file1 - Only this single file.

Responder1

Aqui está o que eu descobri:

Primeiro, a estrutura de diretórios que estou usando como exemplo:

$ find dir1 dir2 dir3 -print
dir1
dir1/file1
dir1/file2
dir1/sub_dir1
dir1/sub_dir1/file1
dir2
dir2/file1
dir2/file2
dir2/sub_dir1
dir2/sub_dir1/file1
dir3
dir3/file1
$

A seguir, minha solução que consiste em três comandos:

Primeiro comando:

tar cvf archive.tar dir1

Bastante padrão. Vamos separar:

  • c- Criar
  • v- Verbose (vamos ver o que está acontecendo)
  • f- o nome do arquivo que queremos, no nosso casoarchive.tar
  • archive.tar- esse argumento real para a nossa fmudança
  • dir1- o que queremos realmente revelar

Segundo comando:

find dir2 -maxdepth 1 -type f -print0 | xargs -0 tar rvf archive.tar

Vamos separar:

  • find dir2- Onde queremos encontrar para pesquisar.
  • -maxdepth 1- Não desça além da profundidade 1 (fique na raiz de dir2)
  • -type f- Procure por arquivos
  • -print0- Não imprima um caractere de nova linha no final; em vez disso, use um caractere nulo. Isso nos ajuda se find encontrar arquivos com espaço em branco.
  • | xargs -0- A entrada padrão que encontramos com o comando find é lançada aqui para ser executada respeitando nossoprint0
  • tar rvf- A única opção nova aqui é r. Esta é a nossa opção de acréscimo. Acrescenta ao nosso archive.tarfinal. Não deve ser confundido com a Aopção específica para anexar arquivos adicionais ( .tar-s).
  • archive.tar- O tar ao qual queremos anexar.

    O final deste comando é onde nosso stdinput é usado. por exemploarchive.tar <stdinput>

Terceiro comando:

tar rvf archive.tar dir3/file1

Anexar a archive.tarum único arquivo ( file1) de dir3.

E, finalmente, a aparência do tar depois de criado. A topção é usada para imprimir seu conteúdo.

$ tar tvf archive.tar
drwxrwxr-x mmallard/mmallard 0 2019-07-18 16:02 dir1/
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:01 dir1/file1
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:01 dir1/file2
drwxrwxr-x mmallard/mmallard 0 2019-07-18 16:02 dir1/sub_dir1/
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:02 dir1/sub_dir1/file1
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:02 dir2/file1
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:02 dir2/file2
-rw-rw-r-- mmallard/mmallard 0 2019-07-18 16:02 dir3/file1
$

informação relacionada