Extraia o conteúdo da pasta do arquivo 7z para uma pasta específica

7

Eu tenho um arquivo 7z que, no nível "raiz", contém um par de arquivos e, em seguida, um diretório, que por sua vez contém arquivos e pastas, assim:

- file1.txt
- file2.txt
- my_dir
    - file3.txt
    - file4.txt
    - another_dir
        - file5.txt
        - file6.txt

Eu gostaria de saber se existe um único comando que me permite extrair o conteúdo de my_dir dentro de um diretório de minha escolha, para que o resultado final seja:

- target_dir
    - file3.txt
    - file4.txt
    - another_dir
        - file5.txt
        - file6.txt

Eu tentei estes comandos:

7za x -y archive.7z -o/path/to/target_dir my_dir
7za x -y archive.7z -o/path/to/target_dir 'my_dir/*'

mas ambos criaram esta estrutura de diretórios:

- target_dir
    - my_dir
        - file3.txt
        - file4.txt
        - another_dir
            - file5.txt
            - file6.txt
    
por Matteo Tassinari 14.10.2018 / 10:21

1 resposta

8

Existe um único comando que permite extrair my_dir para um diretório especificado?

Sim. Use a opção e em vez de x :

7za e -y archive.7z -o/path/to/target_dir my_dir

( x é extraído com caminhos completos )

e (Extract) command

Extracts files from an archive to the current directory or to the output directory. The output directory can be specified by -o (Set Output Directory) switch.

This command copies all extracted files to one directory. If you want extract files with full paths, you must use x (Extract with full paths) command.

Fonte comando e (extrair)

Mas, na verdade, a pasta no arquivo contém subpastas que eu gostaria de preservar

Nesse caso, você precisa usar o comando original (com x ) e, em seguida, usar move para mover o conteúdo de my_dir para um nível superior.

Algo semelhante ao seguinte arquivo em lote (não testado):

@echo off
7za x -y archive.7z -o/path/to/target_dir my_dir
move /y my_dir\* /path/to/target_dir
rd /s my_dir
endlocal

Na linha de comando:

7za x -y archive.7z -o/path/to/target_dir my_dir && move /y my_dir\* /path/to/target_dir && rd /s my_dir

Mas estou usando o Linux!

Em seguida, os comandos a usar são:

#!/bin/bash
7za x -y archive.7z -o/path/to/target_dir my_dir
mv -f my_dir/* /path/to/target_dir
rmdir my_dir

Ou:

7za x -y archive.7z -o/path/to/target_dir my_dir && mv -f my_dir/* /path/to/target_dir && rmdir my_dir

O que provavelmente pode ser simplificado por alguém que conheça bash melhor do que eu.

Leitura Adicional

por 14.10.2018 / 10:44