Quero ter certeza de que entendi o seguinte código:
tar xvzf FILE --exclude-from=exclude.me --strip-components 1 -C DESTINATION
que foi postado nesta resposta .
De man tar
:
--strip-components=NUMBER
retire NUMBER componentes principais de nomes de arquivos na extração
-C
,--directory=DIR
mude para o diretório DIR
Não entendi a explicação do manual para --strip-components
.
Sobre -C
, entendi que significa algo como "colocar componentes despojados em um diretório notável".
O que --strip-components -C
significa?
O fragmento da página de manual que você incluiu em sua pergunta vem de man para GNU tar. GNU é um projeto de software que prefere manuais informativos a páginas de manual. Na verdade, a página de manual tar foi adicionada à árvore de código-fonte GNU tar apenas em 2014 e ainda é apenas uma referência, não um manual completo com exemplos. Você pode invocar um manual de informações completo com
info tar
, ele também está disponível online aqui . Ele contém vários exemplos de--strip-components
uso, os fragmentos relevantes são:e:
Dito isto;
Existem outras implementações do tar por aí, por exemplo, a página de manual tar do FreeBSD tem uma explicação diferente deste comando:
Em outras palavras, você deve entender um caminho Unix como uma sequência de elementos separados por
/
(a menos que haja apenas um/
).Aqui está o meu próprio exemplo (outros exemplos estão disponíveis no manual de informações ao qual vinculei acima):
Vamos criar uma nova estrutura de diretórios:
O caminho
a/b/c
é composto por 3 elementos:a
,b
, ec
.Crie um arquivo vazio neste diretório e coloque-o no arquivo .tar:
FILE
é um 4º elemento doa/b/c/FILE
caminho.Listar o conteúdo de archive.tar:
Agora você pode extrair archive.tar com
--strip-components
um argumento que informará quantos elementos de caminho você deseja remover doa/b/c/FILE
quando extraído. Remova uma
diretório original:Extrair com
--strip-components=1
- apenasa
não foi recriado:Com
--strip-components=2
você vê quea/b
- 2 elementos não foram recriados:Com
--strip-components=3
3 elementosa/b/c
não foram recriados e chegamosFILE
no mesmo diretório de nível em que rodamostar
:-C
opção diz ao tar para mudar para um determinado diretório antes de executar uma operação solicitada, extraindo, mas também arquivando. Neste comentário você perguntou:Por que você acha que
mv
é melhor? Para qual diretório você gostaria de extrair o arquivo tar primeiro:/tmp - e se estiver faltando ou cheio?
"$TMPDIR" - e se estiver desabilitado, ausente ou cheio?
diretório atual - e se o usuário não tiver
w
permissão, apenasr
ex
?e se um diretório temporário, o que quer que já contivesse arquivos com os mesmos nomes que no
tar
arquivo e na extração, os substituísse?e se um diretório temporário, seja o que for, não suportasse sistemas de arquivos Unix e todas as informações sobre propriedade, bits executáveis etc. fossem perdidas?
Observe também que
-C
é umachange directory
opção comum em outros programas também, Git e make são os primeiros que me vêm à mente.A
--strip-components
opção é para modificar os nomes dos arquivos extraídos.--strip-components <N>
significa "remover os primeiros<N>
componentes do nome do arquivo", onde "componentes" está se referindo a partes do caminho separadas por/
.Se você tiver um nome de arquivo
foo/bar/baz
, então com--strip-components 1
o arquivo extraído seria nomeadobar/baz
.A
-C
opção significa apenas "alterar diretório". Se você usa-C /some/other/place
, está efetivamente solicitando antestar
decd /some/other/place
extrair os arquivos. Isso geralmente significa que os arquivos seriam extraídos em relação a/some/other/place
.Para complementar a boa resposta por larsks , para tentar ajudar a esclarecer a confusão em torno da
-C
opção:A
tar
página man indica para a-C
opção:então, não é como
mv
- está literalmente dizendotar
para mudar para um diretório de trabalho diferente. Observe também o ponto em que a ordem é importante. Então:anexaria arquivos
file1
efile2
no local/path
paraarchive.tar
, enquantoanexaria
file1
efile2
do diretório de trabalho atual e, em seguida,file3
efile4
do/path
local.--strip-components
e-C
são opções independentes e não relacionadas aotar
. O primeiro afeta a estrutura de pastas dos arquivos arquivados, uma vez extraídos, e-C
especifica o diretório de trabalho quetar
está sendo usado para especificar os arquivos externos ao arquivamento.Não tenho certeza do que posso dizer como explicação que não tenha sido coberta pelas outras respostas. Em vez disso, tentarei ajudá-lo com exemplos.
Arkadiusz Drabczyk dá o exemplo do manual GNU tar onde seu arquivo inclui uma grande árvore de diretórios (por exemplo, todos
/usr
):e você deseja detalhar o arquivo e extrair um arquivo de um subdiretório de baixo nível:
O que o manual não explica é que, se você diz
then
tar
criará umusr
diretório no diretório atual e uminclude
subdiretório emusr
e, em seguida, extrairástdlib.h
em./usr/include
. Se esse é o resultado que você quer, tudo bem; use esse comando. Mas, se você quiserstdlib.h
no diretório atual, precisaráe então provavelmente
rmdir -p usr/include
. É factível, mas é tedioso.--strip=2
economiza muito tempo de digitação.
ou-C
também pode ser usado com ac
opção (C minúsculo) (criando um arquivo), e isso pode ser mais fácil de entender. Suponha que John, Kate, Larry e Mary estejam colaborando para escrever um livro; eles estão escrevendo os capítulos 1, 2, 3 e 4, respectivamente. John e Kate (apenas) estão usando o mesmo computador e querem arquivar o que fizeram até agora para enviar aos outros autores. Você pode fazer um dos seguintes:Mas eles criam um arquivo que codifica os caminhos do diretório
john/
e . Se você fizer isso, essa seria uma razão para Larry e Mary usarem ou quando extraírem o arquivo. Se você quiser salvá-los que incomodam (e/ou manter seus nomes fora do arquivo; por exemplo, por motivos de privacidade), você podekate/
--strip=2
--strip=1
e então o arquivo mostrará apenas os diretórios
chap1
echap2
.