¿Cómo puedo aplanar una carpeta en Windows 7, suponiendo que todos los nombres de archivo sean diferentes?

19

Por ejemplo, supongamos que tengo la siguiente jerarquía de carpetas:

Folder1
   File1
   Folder2
      File2
   Folder3
      File3
      Folder4
         File4

Quiero realizar algún comando que resulte en:

Folder1
   File1
   File2
   File3
   File4

o algo similar. No estoy muy familiarizado con Windows, por lo que agradecería tantos detalles como sea posible en la respuesta.

Der Hochstapler
fuente
¿Está buscando un programa existente para hacer esto por usted, o un fragmento de código (qué lenguaje de programación) que hace esto?
Matt Ball el
@MattBall: Estoy buscando la forma más fácil de hacer esto. Idealmente, esto sería abrir un terminal e ingresar algún comando. Nuevamente, no tengo mucha experiencia con Windows, así que avíseme si hay una mejor manera. Gracias.

Respuestas:

32

La forma más fácil es ingresar a la carpeta raíz común y buscar todos los archivos (es decir, buscar *). Cuando encuentre todos los archivos, márquelos, presione Ctrl + X y navegue nuevamente a la carpeta raíz común. Ahora presione Ctrl + V para pegar todos los archivos en la carpeta raíz. Cuando termine, elimine todos los subdirectorios.

No sé si esto se puede hacer como un trabajo por lotes.

Henning Klevjer
fuente
1
Me gusta la simplicidad de esto, pero lo probé con archivos de 40k y bloqueó el proceso del explorador.
UpTheCreek
La respuesta total del comandante me parece más fácil.
Ev0oD
13

Al final utilicé este enfoque de PowerShell cuando necesitaba aplanar una gran estructura jerárquica (en mi caso pngs):

Get-ChildItem C:\sourcefolder -Recurse -Filter "*.png" | Copy-Item -destination C:\destinationfolder\
Hasta el arroyo
fuente
Para aplanar, ¿tal vez Move-Item es más adecuado?
geisterfurz007 Detener este caos
4

Windows exe: http://en.sourceforge.jp/projects/sfnet_flatfolder/

o AHK:

fileselectfolder,MyFold,::{20d04fe0-3aea-1069-a2d8-08002b30309d}
SetWorkingDir, %MyFold%
loop, *.*,0,1
{
  parentpath := RegExReplace(A_LoopFileDir,"\\","-")
  ;StringReplace, parentpath, A_LoopFileDir, \,-,All
  newname = %parentpath%-%A_LoopFileName%
  ;msgbox %newname%
  If a_loopfiledir <>
    filemove, %a_loopfilefullpath%,%newname%
}

loop, %myfold%\*.*,2,1
  fileremovedir, %a_loopfilefullpath%,1

exitapp

o use Directory Opus

o Powershell

(ls -r -include *.jpg) | % { mv -literal $_ $_.Name.Insert(0, [String]::Format("{0} - ", $_.Directory.Name))}

o Lote (como se mencionó anteriormente)

o la búsqueda manual, cortar y pegar como se mencionó anteriormente

Hay muchas formas, dependiendo de sus habilidades e inclinaciones, puede elegir cualquiera de estos y refinar según sus necesidades.

Es posible que necesite esto Eliminar directorios vacíos después de la operación anterior

Vijay
fuente
1
el comando powershell es breve y funciona bien
Maxim Yefremov
3

Si solo necesita aplanar el directorio manualmente de vez en cuando, Total Commander es perfecto.

En Total Commander: vaya a su directorio que desea aplanar. En el menú, haga clic en Comandos> Vista de rama . Y lo ve todo aplanado, puede moverlo / copiarlo a otra carpeta.

Si necesita jugar un poco con los nombres de archivo: seleccione todos los archivos en la vista aplanada, en el menú vaya a Archivos> Herramienta de renombrado múltiple . Aquí puede agregar información de la ruta a los nombres de archivo reales usando "Cambiar nombre de máscara", solo necesita usar la etiqueta / botón del complemento allí, la función de búsqueda y reemplazo y el pequeño botón de tonto, que le permite hacer algunas últimas modificaciones a los nombres de archivo en editor de texto. Puede sonar complicado, pero realmente la forma más fácil de IMO :)

teejay
fuente
¿Qué es Windows Commander? ¿Te refieres a Total Commander?
UpTheCreek
Exactamente :) Lo he estado usando durante 10 años, el nombre era Windows Commander en ese entonces. Editado
teejay
Gracias. Solo lo intenté. Sin embargo, no funcionaría para 40k archivos pequeños :( consumió una gran cantidad de CPU durante 10 minutos y luego aparecieron errores repetidos de 'no se
pudo
El uso de la CPU y la lentitud implícita es lamentable pero comprensible :) El error es otra cosa ... podría ser un mal nombre, un error total del comandante o simplemente la incapacidad de TC para manejar esta cantidad de archivos. Intentaría cambiar el nombre de un número menor de archivos primero o usar una versión más nueva de TC
teejay
@teejay, tuve que buscar los detalles de tu sugerencia, pero finalmente logré hacerlo. Utilicé el complemento expander2 para extraer partes de la ruta y convertirlas en el prefijo del nombre del archivo. Es posible que desee agregar algunos detalles para el próximo chico. Tx.
killogre
3

Bastante simple con una opción de línea de comandos para aquellos que no están súper técnicamente inclinados.

  1. Cree un archivo en algún lugar llamado "flatten.cmd"
  2. Abra ese archivo en el Bloc de notas
  3. En el archivo, coloque lo siguiente:

    FOR /R {SourcePath} %%G IN (*.mp3) DO move "%%G" {Destination}
    
  4. Reemplace "{SourcePath}" con la carpeta que desea aplanar. En su caso "c: \ Carpeta1"

  5. Reemplace "{Destino"} con la carpeta a la que desea mover los archivos. En su caso también "c: \ Carpeta1". El código ahora debería verse así:

    FOR /R c:\Folder1 %%G IN (*.mp3) DO move "%%G" c:\Folder1
    
  6. Abre una ventana de línea de comando. Puede hacer esto de varias maneras, pero esto es rápido:

    • Haga clic en el botón de inicio
    • Haga clic en todos los programas
    • Haga clic en accesorios
    • Haga clic en Símbolo del sistema
  7. En la ventana de línea de comando, escriba:

    cd {folder where you put the flatten.cmd file}
    flatten
    

Y eso lo hará (Windows 8+) Acabo de hacer eso para aplanar una carpeta de 10,000 archivos de música. Funciona de maravilla.

Puede encontrar las opciones para la utilidad de línea de comandos FOR en https://technet.microsoft.com/en-us/library/bb490909.aspx .

Ed Williams
fuente
1

usando un script por lotes (fuera de mi cabeza):

Busque el comando FOR

La primera línea mueve todos los archivos desde los subdirectorios hasta la raíz. La segunda elimina las subcarpetas.

for /f %f in ('dir "c:\folder\*" /s/b/a-d') do if not %~ff"=="c:\folder" move "%f" "c:\folder"
for /f %f in ('dir "c:\folder\*" /s/b/ad') do if not "%~ff"=="c:\folder" rd /s/q "%f" 
Sangha Preet
fuente
¿Entonces tengo que abrir una terminal e ingresar estos comandos, asegurándome de reemplazar 'carpeta' con la ruta adecuada? Gracias.
Si no quieres escribirlo en un script, sí. OTOH .....
Sangha el
¿Se puede generalizar y adjuntar a una acción del menú contextual? Me encantaría poder hacer clic con el botón derecho en un archivo, hacer clic en "Acoplar archivo" y luego mover todos los archivos dentro del nivel de la carpeta. Eliminar la carpeta después también sería bueno.
MAW74656
sí, puede ponerlo en un archivo por lotes con% 1 como nombre de carpeta. stackoverflow.com/questions/6162415/…
Preet Sangha
-Tal vez puedas ayudar con este superusuario.com/q/552768/59747
MAW74656
1

Hola, también puede usar la herramienta xxcopy (www.xxcopy.com), su xcopy en esteroides (más o menos). Con esta herramienta puede "aplanar" los archivos en carpetas en una carpeta.

c:> xxcopy / source-folder / flatten / SG

Solo lea este enlace: http://www.xxcopy.com/xxcopy16.htm

Salud.

Broddi RH
fuente