AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 535772
Accepted
user149572
user149572
Asked: 2019-08-16 09:14:47 +0800 CST2019-08-16 09:14:47 +0800 CST 2019-08-16 09:14:47 +0800 CST

O que --strip-components -C significa em tar?

  • 772

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 -Csignifica?

directory tar
  • 4 4 respostas
  • 57203 Views

4 respostas

  • Voted
  1. Best Answer
    Arkadiusz Drabczyk
    2020-03-27T07:12:31+08:002020-03-27T07:12:31+08:00

    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-componentsuso, os fragmentos relevantes são:

    --strip-components=number

    Tira um determinado número de componentes principais dos nomes dos arquivos antes da extração.

    Por exemplo, se o arquivo `archive.tar' contivesse `some/file/name', então executar

    tar --extract --file archive.tar --strip-components=2

    extrairia este arquivo para o arquivo `name'.

    e:

    --strip-components=number

    Tira um determinado número de componentes principais dos nomes dos arquivos antes da extração.

    Por exemplo, suponha que você tenha arquivado toda a hierarquia `/usr' em um arquivo tar chamado `usr.tar'. Entre outros arquivos, este arquivo contém `usr/include/stdlib.h', que você deseja extrair para o diretório de trabalho atual. Para isso, você digita:

    $ tar -xf usr.tar --strip=2 usr/include/stdlib.h

    A opção `--strip=2' instrui o tar a remover os dois componentes principais (`usr/' e `include/') do nome do arquivo.


    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:

    --strip-components count

    Remova o número especificado de elementos de caminho à esquerda. Os nomes de caminho com menos elementos serão ignorados silenciosamente. Observe que o nome do caminho é editado após a verificação dos padrões de inclusão/exclusão, mas antes das verificações de segurança.

    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:

    mkdir -p a/b/c
    

    O caminho a/b/cé composto por 3 elementos: a, b, e c.

    Crie um arquivo vazio neste diretório e coloque-o no arquivo .tar:

    $ touch a/b/c/FILE
    $ tar -cf archive.tar a/b/c/FILE
    

    FILEé um 4º elemento do a/b/c/FILEcaminho.

    Listar o conteúdo de archive.tar:

    $ tar tf archive.tar
    a/b/c/FILE
    

    Agora você pode extrair archive.tar com --strip-componentsum argumento que informará quantos elementos de caminho você deseja remover do a/b/c/FILEquando extraído. Remova um adiretório original:

    rm -r a
    

    Extrair com --strip-components=1- apenas anão foi recriado:

    $ tar xf archive.tar --strip-components=1
    $ ls -Al
    total 16
    -rw-r--r-- 1 ja users 10240 Mar 26 15:41 archive.tar
    drwxr-xr-x 3 ja users  4096 Mar 26 15:43 b
    $ tree b
    b
    └── c
        └── FILE
    
    1 directory, 1 file
    

    Com --strip-components=2você vê que a/b- 2 elementos não foram recriados:

    $ rm -r b
    $ tar xf archive.tar --strip-components=2
    $ ls -Al
    total 16
    -rw-r--r-- 1 ja users 10240 Mar 26 15:41 archive.tar
    drwxr-xr-x 2 ja users  4096 Mar 26 15:46 c
    $ tree c
    c
    └── FILE
    
    0 directories, 1 file
    

    Com --strip-components=33 elementos a/b/cnão foram recriados e chegamos FILEno mesmo diretório de nível em que rodamos tar:

    $ rm -r c
    $ tar xf archive.tar --strip-components=3
    $ ls -Al
    total 12
    -rw-r--r-- 1 ja users     0 Mar 26 15:39 FILE
    -rw-r--r-- 1 ja users 10240 Mar 26 15:41 archive.tar
    

    -Copçã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:

    Pedindo ao tar para fazer cd: por que cd? Quero perguntar, por que não é apenas mv?

    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 wpermissão, apenas re x?

    • e se um diretório temporário, o que quer que já contivesse arquivos com os mesmos nomes que no tararquivo 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é uma change directoryopção comum em outros programas também, Git e make são os primeiros que me vêm à mente.

    • 42
  2. larsks
    2019-08-16T09:29:13+08:002019-08-16T09:29:13+08:00

    A --strip-componentsopçã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 1o arquivo extraído seria nomeado bar/baz.


    A -Copção significa apenas "alterar diretório". Se você usa -C /some/other/place, está efetivamente solicitando antes tarde cd /some/other/placeextrair os arquivos. Isso geralmente significa que os arquivos seriam extraídos em relação a /some/other/place.

    • 19
  3. Time4Tea
    2020-03-27T03:09:32+08:002020-03-27T03:09:32+08:00

    Para complementar a boa resposta por larsks , para tentar ajudar a esclarecer a confusão em torno da -Copção:

    A tarpágina man indica para a -Copção:

    -C, --directory=DIR
                  Change  to DIR before performing any operations.  This option is
                  order-sensitive, i.e. it affects all options that follow.
    

    então, não é como mv- está literalmente dizendo tarpara mudar para um diretório de trabalho diferente. Observe também o ponto em que a ordem é importante. Então:

    tar r -f archive.tar -C /path file1 file2
    

    anexaria arquivos file1e file2no local /pathpara archive.tar, enquanto

    tar r -f archive.tar file1 file2 -C /path file3 file4
    

    anexaria file1e file2do diretório de trabalho atual e, em seguida, file3e file4do /pathlocal.

    --strip-componentse -Csão opções independentes e não relacionadas ao tar. O primeiro afeta a estrutura de pastas dos arquivos arquivados, uma vez extraídos, e -Cespecifica o diretório de trabalho que tarestá sendo usado para especificar os arquivos externos ao arquivamento.

    • 2
  4. G-Man Says 'Reinstate Monica'
    2020-03-29T09:41:31+08:002020-03-29T09:41:31+08:00

    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):

    $ tar -cf usr.tar  /usr
    

    e você deseja detalhar o arquivo e extrair um arquivo de um subdiretório de baixo nível:

    $ tar -xf usr.tar --strip=2 usr/include/stdlib.h
    

    O que o manual não explica é que, se você diz

    $ tar -xf usr.tar           usr/include/stdlib.h
    

    then tarcriará um usrdiretório no diretório atual e um  includesubdiretório em usre, em seguida, extrairá stdlib.hem ./usr/include. Se esse é o resultado que você quer, tudo bem; use esse comando. Mas, se você quiser stdlib.hno diretório atual, precisará

    $ mv usr/include/stdlib.h .
    

    e então provavelmente rmdir -p usr/include. É factível, mas é tedioso.  --strip=2economiza muito tempo de digitação.


    -Ctambém pode ser usado com a  copçã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:

      ( cd para algum diretório adequado) 
    $ tar cf chap12.tar /home/john/chap1 /home/kate/chap2
    ou

    $ cd /home
    $ tar cf /tmp/chap12.tar john/chap1 kate/chap2
    

    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

      ( cd para algum diretório adequado) 
    $ tar cf chap12.tar -C /home/john chap1 -C /home/kate chap2

    e então o arquivo mostrará apenas os diretórios chap1e chap2.

    • 0

relate perguntas

  • significado de traços nus neste exemplo de curl/tar

  • diretório tar para enviar apenas blocos modificados de arquivos

  • Maneira mais rápida de determinar se o conteúdo do diretório mudou desde a última vez

  • Em Solaris; encontrar, anexar a uma bola de alcatrão e comprimir a pergunta

  • bsdtar: Como evitar sobrescrever as informações do arquivo existente?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve