Como extrair arquivos da árvore usando o CMD

1

Digamos que eu tenha a seguinte árvore:

├───animals
│   │   hippopotamus.txt
│   │   lion.txt
│   │
│   └───dog
│           poodle.txt
│           terrier.txt
│
└───food
    ├───fruit
    │       apple.txt
    │       orange.txt
    │
    └───vegetables
            borcolli.txt
            carrot.txt
            corn.txt

Qual comando eu usaria para criar um diretório que contenha todos os arquivos .txt, mas sem as subpastas, essencialmente 'nivelando' a árvore.

    
por tuskiomi 10.05.2017 / 18:32

2 respostas

3

Resposta

Supondo que você tenha um diretório de destino em mente (C: \ Target) e todos os arquivos .txt estejam no diretório C: \ Tree, o comando a seguir obteria uma lista de todos os arquivos .txt e os copiaria para o seu destino desejado:

for /F "delims=" %a in ('dir /s /b "C:\Tree\*.txt" ') do (copy "%a" "C:\Target")

Eu coloco aspas duplas em torno dos parâmetros que podem conter espaços.

Explicação

for /F

Executa um texto de análise de loop for. Por padrão, os tokens serão divididos em espaços nas variáveis% a,% b,% c, etc. Como não queremos esse comportamento, especifiquei:

"delims="

O que significa sem delimitadores. % a será a variável que contém cada linha de texto da saída do nosso comando. O comando que usei foi:

dir /s /b "C:\Tree\*.txt"

Isso executa uma listagem de diretórios de todos os arquivos que correspondem a * .txt na pasta C: \ Tree. O sinalizador / s executa recursivamente, pesquisando dentro de todos os subdiretórios / subpastas. O sinalizador / b gera a listagem em um formato "simples", que basicamente apenas lista o arquivo e o caminho. A saída se parece com:

C:\Tree\animals\hippopotamus.txt
C:\Tree\animals\lion.txt
C:\Tree\animals\dog\poodle.txt
C:\Tree\animals\dog\terrier.txt
C:\Tree\food\fruit\apple.txt
C:\Tree\food\fruit\orange.txt
C:\Tree\food\vegetables\borcolli.txt
C:\Tree\food\vegetables\carrot.txt
C:\Tree\food\vegetables\corn.txt

E claro:

copy "%a" "C:\Target"

Copia o arquivo representado pela variável% a para o diretório C: \ Target. O loop for basicamente executa os seguintes comandos:

copy "C:\Tree\animals\hippopotamus.txt" "C:\Target"
copy "C:\Tree\animals\lion.txt" "C:\Target"
copy "C:\Tree\animals\dog\poodle.txt" "C:\Target"
copy "C:\Tree\animals\dog\terrier.txt" "C:\Target"
copy "C:\Tree\food\fruit\apple.txt" "C:\Target"
copy "C:\Tree\food\fruit\orange.txt" "C:\Target"
copy "C:\Tree\food\vegetables\borcolli.txt" "C:\Target"
copy "C:\Tree\food\vegetables\carrot.txt" "C:\Target"
copy "C:\Tree\food\vegetables\corn.txt" "C:\Target"

Para obter mais ajuda sobre opções DIR ou loops FOR no Prompt de Comando do Windows (CMD), você pode digitar help dir ou help for . Cuidado, a página de ajuda do loop FOR é bastante longa. ;)

    
por 10.05.2017 / 18:41
1

Uma solução do PowerShell:

mkdir C:\AllTxt ; gci C:\Install *.txt -Recurse | copy-item -Destination C:\AllTxt -Force 
  • mkdir cria um novo diretório, como C:\AllTxt
  • gci obtém todos os arquivos txt em C:\install (o diretório superior de sua estrutura de árvore) recursivamente
  • copy-item copia os arquivos para o destino
por 11.05.2017 / 15:12