Listar todos os arquivos e diretórios sem recursão com junções

1

Existe uma ferramenta native | portable que pode me dar um unicode ( ou pelo menos sistema local-compatível lista de todos os arquivos e diretórios em um caminho recursivamente , sem recursão em pontos de junção ou links, no Windows?

Por exemplo, o comando dir integrado, bem como takeown e icacls , são executados em um loop infinito com o diretório Application Data (1 ).

EDIT Eu gostaria de poder obter um arquivo de texto ou pelo menos uma transferência fácil da área de transferência como saída.

    
por n611x007 05.01.2013 / 12:00

9 respostas

5

Esta foi de alguma forma uma questão difícil. Mesmo o StackOverflow tem apenas soluções sofisticadas

Mas aqui está um simples para listar todos os arquivos recursivamente sem loops de pastas de junção.

Use o PowerShell e teste cada arquivo se ele contiver o atributo "ReparsePoint"

function Recurse($path) {

  $fc = new-object -com scripting.filesystemobject
  $folder = $fc.getfolder($path)

  foreach ($i in $folder.files) { $i | select Path }

  foreach ($i in $folder.subfolders) {
    $i | select Path        
    if ( (get-item $i.path).Attributes.ToString().Contains("ReparsePoint") -eq $false) {        
        Recurse($i.path)
    }
  }
}

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition
$outputlist = Recurse($scriptPath) | Out-File -Filepath .\outputlist.txt 
  1. Cole o código em um arquivo de texto e salve-o como script do PowerShell (.ps1)
  2. Coloque o script dentro da pasta desejada para listar todos os arquivos + pasta recursivamente
  3. Execute o script com o PowerShell. Um novo arquivo chamado outputlist.txt no mesmo local aparecerá

Comparação rápida entre o script Powershell e um comando em lote comum

powershell  - good, no indefinite loops

batch"DIR /B /S" - bad, indefinite loops through junctions points

    
por 05.01.2013 / 12:41
2

Usando o powershell de forma mais sucinta:

$items = @(pwd);
while($items){ $newitems = $items | Get-ChildItem | Where-Object -Property Attributes -NotLike *ReparsePoint*; $newitems; $items = $newitems | Where-Object -Property Attributes -Like *Directory* }

Para colocar tudo isso em um arquivo de texto, basta colocar a coisa toda entre parênteses e enviá-la para fora do arquivo.

( $items = @(pwd); while($items){ $newitems = $items | gci | where -Property Attributes -NotLike *ReparsePoint*; $newitems; $items = $newitems | where -Property Attributes -Like *Directory* } ) out-file myfile.txt
    
por 26.09.2013 / 07:19
1

O problema aqui é que alguém removeu a anti-recursão da pasta Application Data.

Ele precisa ter um DENY para TODOS para Listar dados de pasta / leitura.

Se você quiser entrar, use a pasta AppData, que é onde ela aponta.

Existem dois pontos de junção - um em %userprofile% e outro em %userprofile%\local .

    
por 07.06.2015 / 20:28
0

Em um prompt do CMD:

dir /A:-L /S /B

EDIT: Enquanto isso não irá listar a junção real no diretório em que reside, ele irá recuar no cruzamento.

    
por 23.08.2014 / 04:58
0

Esse problema pode ser devido à remoção de permissões de anti-recursão da pasta Application Data (como pode ser aplicado a qualquer ponto de junção do Windows Vista + criado para compatibilidade com versões anteriores).

Esses pontos de junção devem ter DENY para TODOS em permissões de Listar Pasta / Ler Dados, o que terá precedência sobre qualquer permissão ALLOW, e esperamos que não seja contornado por qualquer programa de recursão de diretório devido à maneira como ele acessa o sistema de Arquivos.

De link , apareceria Junction os pontos são identificados por ter o atributo ReparsePoint , juntamente com os atributos Hidden e System .

O comando Powershell a seguir é a base do que parece ser uma solução mais simples para excluir Pontos de Junção de recursões de diretório do que qualquer resposta anterior.

get-childitem $RootDirectoryForRecusion -recurse -force | where-object {-not ($_.Attributes -match "ReparsePoint" -and $_.Attributes -match "Hidden" -and $_.Attributes -match "System")}

    
por 04.05.2016 / 21:40
0

No PowerShell 3.0, há um novo parâmetro Attribute:

Lista a estrutura de diretórios sem pastas de junção:

Get-ChildItem -Path $RootDirectory -Attributes !ReparsePoint -Recurse -Force -ErrorAction SilentlyContinue

Lista as pastas de junção apenas de uma estrutura de diretórios:

Get-ChildItem -Path $RootDirectory -Attributes ReparsePoint -Recurse -Force -ErrorAction SilentlyContinue

Mais informações: Use o PowerShell 3.0 para filtrar arquivos com base em atributos avançados

    
por 07.05.2016 / 02:25
0

1. Use um script pequeno, então tudo será listado, mas as junções não serão seguidas.

Funciona bem no Windows 7, ao contrário da opção abaixo nesta resposta

vamos chamá-lo de dnj.cmd (como em Dir No Junctions)

@(SETLOCAL ENABLEEXTENSIONS
ECHO OFF

CHCP 65001>NUL
IF "%~1"=="" (CALL :listDir .) ELSE CALL :listDir %1
EXIT /B
)
:listDir <path>
( FOR /F "usebackq delims=" %%F IN ('DIR %1 /B /A') DO ECHO %~1\%%~F
FOR /F "usebackq delims=" %%F IN ('DIR %1 /B /AD-L') DO CALL :listDir "%~1\%%~F"
EXIT /B )

Primeiro FOR / DIR para saída, segundo FOR / DIR para recursão. Dessa forma, você também pode ajustar os parâmetros de saída (especificamente, os argumentos DIR e ECHO). Por exemplo, se você deseja apenas uma lista simples de arquivos na saída sem diretórios, use

( FOR /F "usebackq delims=" %%F IN ('DIR %1 /B /A-D') DO ECHO %%~F

no lugar do primeiro FOR.

Invocação: dnj.cmd path

O redirecionamento de saída funciona da mesma forma que com o DIR convencional, então

cmd /C "dnj.cmd "%USERPROFILE%" | CLIP"

funciona no prompt do Win + R ("Executar").

2. Se você estiver no Windows 10, use DIR / S / A-L

Dessa forma, as junções não serão listadas, nem serão retornadas com / S. No Windows 7, o DIR / S / AD-L recorre a junções. Não tenho certeza sobre 8 / 8.1.

lote com saída para arquivo de texto:

CHCP 65001 & REM for UTF-8
DIR %* /B /S /A-L > out.txt

(caminho de passagem e argumentos DIR adicionais como argumentos de lote)

cmd.exe para a área de transferência (pode ser invocado via Win + R):

cmd /C "CHCP 65001 & DIR "%USERPROFILE%" /B /S /A-L | CLIP"

A área de transferência é unicode por padrão, mas sem o CHCP antecipadamente, a saída DIR está na página de códigos OEM, portanto, alguns caracteres podem ser perdidos. Citações após / C são requeridas pela sintaxe do CMD, apesar de parecer estranho com aspas internas em torno de %USERPROFILE% .

    
por 06.10.2016 / 15:40
0

No PowerShell,

Get-ChildItem /Recurse <path> |
Where-Object { $_.Mode -notlike 'd*l' } |
ForEach-Object { $_.FullName};

Você pode simplesmente enviar a saída para um arquivo se quiser salvá-lo.

    
por 05.08.2017 / 11:04
0

Isso pode não ser uma ferramenta nativa, mas pode ser útil para alguém com o Windows 7, há um programa chamado FileLocator Pro que tem uma opção em Advanced / Junction Points para desativar os pontos de junção de pesquisa.

Uma vez feito isso, você pode usar o programa de linha de comando flpsearch assim:

"C:\Program Files\Mythicsoft\FileLocator Pro\flpsearch.exe" -o c:\biglist.txt -d c:\;d:\;e:\ -ofbs -f *

Echo Started cleanup

for /F "tokens=1-2 delims=  " %%i in (c:\biglist.txt) do if "!prevx!" neq "%%i" (ECHO %%i >> c:\big.txt & (if /i "%%j" neq "on" echo        %%j >> c:\big.txt) & set prevx=%%i) else (if /i "%%j" neq "on" echo     %%j >> c:\big.txt) 

Há guias literais depois dos ecos e delims para que o editor de texto não converta as guias para espaços.

Espero que isso seja útil para um usuário do Win7 ou dois.

Ofc as opções do powershell também são boas, mas o DOS é outra história.

    
por 11.12.2017 / 09:27