Estou tentando gerar um arquivo de texto contendo o nome do arquivo (incluindo o caminho completo) e o tamanho do arquivo para todos os arquivos em um diretório específico e qualquer um de seus subdiretórios (ou seja, recursivamente). Idealmente, não quero vírgulas no tamanho do arquivo (mas aceitarei elas!)
O seguinte comando faz isso, mas sem o tamanho do arquivo:
dir /b /s /a:-D > results.txt
Um exemplo de saída seria semelhante a:
C:\Users\Martin\Pictures\Table\original\PC120013.JPG 227298
C:\Users\Martin\Pictures\Table\original\PC120014.JPG 123234
C:\Users\Martin\Pictures\Table\original\PC120015.JPG 932344
Eu não acho que isso seja possível usando dir
sozinho, embora eu adoraria provar que estou errado. Existe outra maneira de fazer isso, usando apenas comandos disponíveis no prompt de comando?
fonte
"tokens=*"
seguinte@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za
txt
arquivo?for /r %a in (*) do echo %~fa %~za
>> C:\Temp\VideoList.txt
- Os resultados de qualquer processo anterior foram gravados em um arquivo de texto chamado VideoList . Usar um > substituirá o arquivo ( se ele já existir ) e usar >> acrescentará novos resultados ao final se o arquivo de texto ( se ele já existir ). Se o arquivo de texto ainda não existir, este comando gravará um novo arquivo com o nome especificado.@echo off & for /f "tokens=*" %a in ('dir *.dwg /s /b') do echo %~fa >>dwgfiles.txt
Alternativa nº 1: FOR / R é mais intuitivo que o nº 2 para mim.
Alternativa 2: FOR / F corrige o problema com "espaços em nomes" na sugestão de BrianAdkins.
Alternativa 3: FORFILES seria minha escolha, exceto que o caminho está entre aspas duplas.
Brian ou outros gurus podem ter uma solução mais elegante ou sugerir uma dúzia de outras soluções, mas essas três funcionam. Tentei usar o FOR TOKENS, mas tive que retirar cabeçalhos e rodapés, então voltei para o # 1. Também considerei criar um pequeno arquivo .bat e chamá-lo, mas isso adiciona outro arquivo (embora ele forneça maior flexibilidade, como seria uma função).
Testei todas as alternativas com nomes de diretório e arquivos com espaços incorporados, um nome de arquivo com mais de 200 caracteres, um nome de arquivo sem extensão e na raiz de uma pequena unidade (apenas por tempo; um pouco lenta - como Brian sugeriu - mas então está pesquisando no Windows Explorer; foi por isso que instalei o aplicativo de pesquisa Tudo).
Alternativa 1: FOR / R
Melhor (?) Enquanto tentava descobrir por que a solução de Brian não funcionou para mim, olhei para HELP FOR e decidi tentar a abordagem / R. (Criar um arquivo seria o mesmo que na alternativa nº 2).
Exemplo - Trabalhos (diretório diferente do que acima para demonstrar recursão)
Alternativa # 2: FOR / F
BrianAdkins 'sugeriu:
@echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
Uma resposta corrigida é:
Uma resposta mais completa com os diretórios suprimidos e a saída (anexada) em um arquivo é:
Nota: "delims = *" especifica um caractere não permitido nos nomes de arquivos.
Nota: O segundo comando também suprime os diretórios via / a: -d.
Nota: Coloque o nome da variável FOR em maiúsculas para esclarecer a distinção entre parâmetros de variável e variável se alguém escolher nomes de variáveis diferentes.
Nota: Anexado ao arquivo apenas para sorrisos, pois o OP solicitava saída para um arquivo.
Suponho que realmente devo verificar o status do ECHO e redefini-lo também.
Edição - Espaços em Nomes
A solução proposta por Brian não lida com nomes de arquivos e pastas que contenham espaços (pelo menos não na minha configuração do Vista).
Exemplo - Errado (sem delimitações; inclui suprimir o diretório por OP, mas com tamanho antes e depois do nome do arquivo para ênfase)
Nome e tamanho truncados (4 de 6 arquivos incorretos):
Exemplo - Correto (Anote a saída na tela, não anexada ao arquivo)
Alternativa nº 3: FORFILES (edição de cotação)
Esta solução é diretamente dos dois últimos exemplos na documentação do FORFILES (
forfiles /?
).A combinação desses exemplos e a gravação em um arquivo produz a resposta (quase):
Observe que o caminho está entre aspas na saída.
Não importa se é alternado
echo on
ou nãoecho off
.Adicionar uma linha em branco que separa cada diretório seria uma extensão trivial do FI.
Cuidado : O uso da máscara
/m *.*
não retornará arquivos sem extensão (como o último arquivo no exemplo)!Além : Escreve um arquivo em cada diretório com o conteúdo desse diretório:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
não o que o OP queria, mas às vezes útil.Exemplo - Funciona (mas com caminho completo entre aspas)
Este exemplo inclui um diretório extra com um nome de arquivo super longo e um nome de arquivo sem extensão.
Problema: Caminho entre aspas
Portanto, existe uma maneira fácil de remover as aspas indesejadas (?) Pelo exemplo do OP e salvar a Alternativa nº 3: FORFILES. (Pergunta retórica: as aspas são um recurso ou uma falha?)
fonte
Sei que isso requer uma utilidade extra , mas você pode conseguir isso de maneira bastante sucinta usando o utilitário sfk :
(Eu consegui a abordagem usando o comando sfk encadeado aqui )
fonte
Isso pode estar enganando a questão dos OPs. No entanto, a questão não é mais relevante nos sistemas modernos baseados no Windows. O alias Dir foi usado para ajudar a desenhar o link lógico.
fonte
powershell "Get-ChildItem -Recurse| select name,length"
Abaixo está o que eu usei para localizar arquivos de vídeo variados que estavam ocupando muito espaço em uma unidade de rede e gravar os resultados em um arquivo de texto em um PC local.
Estou postando minha própria resposta um tanto tardia por três razões. Um, eu gosto de respostas concisas. Segundo, essa única linha de script funcionou em várias configurações para mim, inclusive em uma rede. Terceiro, pelo comentário potencialmente obscuro de Don Vince sob a resposta de BrianAdkins, o uso de tokens pode ignorar problemas de nomes de arquivos com espaços neles.
for /f "tokens=*" %%a in ('dir H:\*.mov H:\*.avi H:\*.wmv H:\*.mp4 /s /b') do echo %%~fa %%~za >> C:\Temp\VideoList.txt
Percebi que caminhos de arquivos / nomes de arquivos muito longos (centenas de caracteres) também podem causar erros, mas a pesquisa não será interrompida. No entanto, o caminho ainda não foi totalmente explorado para o (s) seu (s) alvo (s). Uma vez observado, você pode compensar iniciando mais profundamente na estrutura da pasta para eliminar esse erro.
Esta página ss64 tem uma apresentação muito boa do uso do comando dir , listando todas as opções, muitas combinações de opções e mostrando vários exemplos úteis de sintaxe adequada. Não é tão abrangente quanto as várias comunidades do Stack Exchange, mas há uma clareza definitiva na apresentação quando você se sentir confortável com a linha de comando / script em lote.
fonte
Eu cheguei a isso com o seguinte comando:
O resultado:
PS Isso é baseado na resposta do BillR (alternativa nº 1). No entanto, no meu caso, ele trava com
@echo off
.fonte
Acho o comando "du" bastante útil e funciona no Windows e no Unix (usei para verificar se todos os arquivos foram copiados ao transferir muitos dados de um PC com Windows para um servidor Web Linux):
saídas:
No entanto, só consegui ver corretamente os caracteres especiais no bloco de notas, não no bloco de notas ++ (deve haver alguma coisa de codificação ANSI / UTF-8, não há tempo para analisar exatamente agora). Também não encontrei uma solução para exibir o tamanho após o nome do arquivo. Use as opções "b" ou "k" em vez de "h" para exibir o tamanho em bytes ou kilobytes. Tive algum problema ao executar o comando fora da pasta que desejo analisar. Portanto, é melhor inserir o comando no diretório certo ("C: \ your_dir" neste exemplo) e especificá-lo no comando
fonte
Omita eb em dir / b / s / a: -D> results.txt e os resultados devem ter a aparência (ou seja, dir / s / a: -D> results.txt):
fonte
Sem ficar muito complicado, isso deve produzir a saída desejada. Vai dar um pouco mais do que o OP pediu, mas achei que valeria a pena mencionar. Adicione a opção / R para especificar um diretório que não seja atual.
fonte
ERROR: Invalid syntax. Value expected for '/r'
portanto, volte para a prancheta e forneça a sintaxe correta e edite sua resposta com os detalhes corretos.where /?
diz: “Por padrão, a pesquisa é feita no diretório atual e nos caminhos especificados pela variável de ambiente PATH . ”- então seuwhere * /t
comando lista todos os arquivosC:\Windows\System32
, subdiretóriosC:\Program Files
e todos os outros diretóriosPATH
. Para mim, foram mais de 3000 linhas. Considere editar sua resposta para torná-la razoável. PS Sem/R
, não é recursivo.