Posso mover em lote muitos arquivos em muitos subdiretórios/pastas separados para um único arquivo principal no Windows?

Posso mover em lote muitos arquivos em muitos subdiretórios/pastas separados para um único arquivo principal no Windows?

Eu tenho muitos arquivos em locais como este:

C:/Users/(Username)/Desktop/(Parent-Collection name)/(filename1)/(filename1).ext

.../(filename2)/(filename2).ext

.../(filename3)/(filename3).ext

Estou tentando mover os .extarquivos em lote para a pasta pai, então é:

C:/Users/(Username)/Desktop/(Parent-Collection name)/(filename1).ext

Eliminando essencialmente a necessidade da subpasta, como tirar divisórias de um fichário escolar.

Responder1

Você pode ter que fazer isso comCygwin, que eu recomendo para quem (ainda??) executa o spyware M$ Windoze.

Algo assim deve funcionar. Execute-o no diretório C:/Users/(Username)/Desktop/(Parent-Collection name)/(que no cygwin seria referido como /cygdrive/c/Users/(Username)/Desktop/(Parent-Collection name)/):

for i in `find . -name "*" -type f`; 
    do mv $i `echo $i | sed 's/.*\/\([^/]*\)/\1/'`; 
done

Isso moverá todos os arquivos em todos os diretórios abaixo (Parent-Collection name)para (Parent-Collection name). Especificamente, este é um doloop com o índice ipercorrendo todos os arquivos do diretório atual para baixo. Isso é o que o findcomando lista. Você pode procurar a sintaxe executando man find. Então o que você executa é mover ( mv) esse arquivo ( $i) para o novo local. Esse novo local é especificado pelo nome do arquivo original ( echo $i) executado através do editor de fluxo ( sed, com o qual você pode pesquisar man sed) que está configurado para retirar o caminho, deixando o nome do arquivo base.

Sugiro testá-lo (crie um diretório com alguns subdiretórios contendo alguns arquivos de texto vazios ou algo assim) e certifique-se de ter um backup!

Você pode então querer remover todos os diretórios (agora vazios) abaixo do seu diretório atual:

for i in `find . -name "*" -type d`; 
    do rmdir $i; 
done

A única coisa diferente aqui é que você está dizendo findpara procurar diretórios ( -type d) em vez de arquivos ( -type f) e depois remover esses diretórios ( rmdir, que só funciona em diretórios vazios).

Linux não é legal? O Cygwin oferece um pouco do poder do Linux e pode ser o primeiro passo para deixá-lo confortável o suficiente com ele, para que algum dia você possa até achar que pode mudar para algo como o Ubuntu. :)

Responder2

Isso pode ser feito com o Powershell, embora não saibamos qual versão do Windows você está usando.

$sourcefolder = "C:\Users\username\Desktop\ParentCollectionName"

$allfiles = Get-ChildItem -Recurse $sourcefolder | Where-Object {$_.PSIScontainer -eq $false}
ForEach ($file in $allfiles)
    {
        $destinationfolder = Split-Path -Parent $file.Directory.FullName
        Move-Item $file.FullName $destinationfolder
    }

Todos os arquivos nos subdiretórios $sourcefolderserão movidos para a ParrentCollectionNamepasta. Então você pode excluir as subpastas vazias.

Fonte

informação relacionada