Как я могу переместить файлы из двухуровневых папок в одноуровневую папку

3

У меня есть куча файлов, хранящихся в каталоге файлов, как таковой

root_folder
  -- folder1
     --folder1_2
       --bunch of files here
  -- folder2
     --folder2_2
       --bunch of files here
  -- folder3
     --folder3_2
       --bunch of files here

Как видите, мои файлы в двухуровневой папке из корневой папки. Как я могу легко переместить мою связку файлов, так как каталог становится таким:

root_folder
  -- folder1
     --bunch of files here
  -- folder2
     --bunch of files here
  -- folder3
     --bunch of files here

Есть ли какая-нибудь бесплатная программа, которую я могу использовать? Или, может быть, я могу использовать командную строку для достижения этой цели? Большое спасибо за помощь :)

Николас Ли
источник
Какая операционная система ?????
Surfasb
Windows 7 32-разрядная
Николас Ли

Ответы:

3

Я также привел пример Powershell:

$source = "c:\sourceFolder"   
$dirs = dir $source | Where-Object {
$_.PSIsContainer }  

foreach ($folder in $dirs){  
    dir $folder -recurse | Where-Object { ! $_.PSIsContainer } | Move -Destination $folder -WhatIf  
     dir $folder -recurse | Where-Object { $_.PSIsContainer } | rd -recurse -Whatif  
}

Вы можете скопировать и вставить это в Powershell ISE. Полужирные переключатели в основном выводят пробный прогон.

Вы можете проверить вывод, чтобы убедиться, что он перемещает файлы туда, куда вы их точно хотите. Удалите ключи -whatif, чтобы скрипт работал .

surfasb
источник
Я скопировал вставил ваш код, и это дает следующую ошибку: Отсутствует выражение после унарного оператора '!'. В строке: 5 символов: 39
Николас Ли
@NicholasLie: Редактировать: я не форматировал код как код, поэтому некоторые символы не были удалены. Там должно быть подчеркивание после $.
Surfasb
2

Решение Powershell. Используйте это в root_folder(убедитесь, что нет свободных файлов непосредственно под root_folder):

gci -R | ?{!$_.PSIsContainer} | %{mv $_.fullname $_.directory.parent}

Вышеуказанный файл помещает любой найденный файл в тот же каталог, в котором находится родительский каталог файла.

Затем, чтобы удалить все пустые папки:

gci -R | ?{(gci $_) -eq $NULL} | rm

SpellingD
источник
0

Вот пакетный скрипт Windows для этого.

Этот первый сценарий будет перемещать файлы только внутри структуры каталогов, аналогичной показанной в вопросе OP.

Измените значение переменной сценария "topfolder", чтобы она содержала "базовую папку" для структуры каталогов.

Измените значение переменной сценария «subfolderprefix», чтобы оно содержало общий префикс для папок «первого уровня», которые нужно искать в «topfolder». В вопросе OP этот «префикс» был «папкой», но при необходимости его можно изменить на любую строку. Используя, например, «folder» в качестве префикса, скрипт будет искать папки следующим образом:

top_folder
   folder1
   folder2
   folder3
   folder99
   folderABC

но другие папки в "top_folder" будут пропущены, например:

top_folder
   somefolder
   someotherfolder

Подпапки «второго уровня», в которых будут выполняться поиск файлов, имеют общий префикс родительского имя-папки, за которым следует «_» ( folder1\folder1_xxx). Опять же, любые другие папки будут пропущены:

top_folder
   folder1
       folder1_2
           (Files here will be moved to "folder1")
       folder1_99
           (Files here will be moved to "folder1")
       folder1_ABC
           (Files here will be moved to "folder1")
   folder2
       folder2_2
           (Files here will be moved to "folder2")
       somesubfolder
           (Files here will be skipped)
   folder3
       folder3_1
           (Files here will be moved to "folder3")
       folder3_2
           (Files here will be moved to "folder3")
   folder99
       folder99_XYZ
           (Files here will be moved to "folder99")
   folderABC
       folderABC_123
           (Files here will be moved to "folderABC")
   somefolder
       (Folders here will be skipped)
   someotherfolder
       (Folders here will be skipped)


Вот пакетный скрипт:

@echo off

set "topfolder=C:\Temp\SU373589\top_folder"
set "subfolderprefix=folder"

set "startdir=%CD%"
cd /d "%topfolder%"

set ctoptest=0
set cfilecount=0

for /d %%f in ("%subfolderprefix%*") do call :worklevel1 "%%~f"
if %ctoptest% EQU 0 echo There are no matching subfolders in "%topfolder%".
if %cfilecount% EQU 0 echo There were no files moved.
if %cfilecount% EQU 1 echo %cfilecount% file was moved.
if %cfilecount% GEQ 2 echo %cfilecount% files were moved.

cd /d "%startdir%"
goto :EOF





:worklevel1

set "subfolder=%~1"
set /a ctoptest+=1

echo Processing subfolder "%subfolder%" ...

set "subsubfolderprefix=%subfolder%\%subfolder%_"
set cwork1test=0

for /d %%g in ("%subsubfolderprefix%*") do call :worklevel2 "%%~g"
if %cwork1test% EQU 0 echo There are no matching subfolders in "%subfolder%"
echo.

set "subfolder="
set "subsubfolderprefix="
set cwork1test=
goto :EOF





:worklevel2

set "subsubfolder=%~1"
set /a cwork1test+=1

echo Processing subsubfolder "%subsubfolder%" ...
set cwork2test=0

for %%h in ("%subsubfolder%\*") do call :workmove "%%~h"
if %cwork2test% EQU 0 echo There are no files to move in "%subsubfolder%"

set "subsubfolder="
set cwork2test=
goto :EOF





:workmove

set "targetfile=%~1"
set /a cwork2test+=1
set /a cfilecount+=1

echo Moving file "%targetfile%" to "%subfolder%" (%cwork2test%)...

move "%targetfile%" "%subfolder%" >nul 2>&1

set "targetfile="
goto :EOF




Этот второй пакетный скрипт будет работать аналогичным образом, просматривая ВСЕ подпапки «первого уровня» и перемещая все файлы из всех подпапок «второго уровня» в подпапки «первого уровня». Он не будет соответствовать ни одному из префиксов ни одному из следующих имен.

Измените значение переменной сценария "topfolder", чтобы оно содержало базовую папку для структуры каталогов.

@echo off

set "topfolder=C:\Temp\SE373589\top_folder"

set "startdir=%CD%"
cd /d "%topfolder%"

set ctoptest=0
set cfilecount=0

for /d %%f in ("*") do call :worklevel1 "%%~f"
if %ctoptest% EQU 0 echo There are no matching subfolders in "%topfolder%".
if %cfilecount% EQU 0 echo There were no files moved.
if %cfilecount% EQU 1 echo %cfilecount% file was moved.
if %cfilecount% GEQ 2 echo %cfilecount% files were moved.

cd /d "%startdir%"
goto :EOF





:worklevel1

set "subfolder=%~1"
set /a ctoptest+=1

echo Processing subfolder "%subfolder%" ...
set cwork1test=0

for /d %%g in ("%subfolder%\*") do call :worklevel2 "%%~g"
if %cwork1test% EQU 0 echo There are no matching subfolders in "%subfolder%"
echo.

set "subfolder="
set cwork1test=
goto :EOF





:worklevel2

set "subsubfolder=%~1"
set /a cwork1test+=1

echo Processing subsubfolder "%subsubfolder%" ...
set cwork2test=0

for %%h in ("%subsubfolder%\*") do call :workmove "%%~h"
if %cwork2test% EQU 0 echo There are no files to move in "%subsubfolder%"

set "subsubfolder="
set cwork2test=
goto :EOF





:workmove

set "targetfile=%~1"
set /a cwork2test+=1
set /a cfilecount+=1

echo Moving file "%targetfile%" to "%subfolder%" (%cwork2test%)...

move "%targetfile%" "%subfolder%" >nul 2>&1

set "targetfile="
goto :EOF




Более простая версия пакетного скрипта без проверки пустых папок и т. Д.:

@echo off

set "topfolder=C:\Temp\SE373589\top_folder"

set "startdir=%CD%"
cd /d "%topfolder%"

for /d %%f in (*) do (
    echo Processing folder: "%%~f"
    for /d %%g in ("%%f\*") do (
        echo Processing sub-folder: "%%~g"
        for %%h in ("%%~g\*") do (
            echo Moving file: "%%~h"  to  "%%~f"
            move "%%~h" "%%~f" >nul 2>&1
        )
    )
    echo.
)

cd /d "%startdir%"




И, наконец, «минимальный» сценарий без обмена сообщениями и при условии, что вы уже находитесь в нужной «базовой папке»:

@echo off
for /d %%f in (*) do (
    for /d %%g in ("%%f\*") do (
        for %%h in ("%%~g\*") do move "%%~h" "%%~f" >nul 2>&1
    )
)




И, на случай, если вы ожидаете этого, «один вкладыш» можно запустить из командной строки:

@for /d %f in (*) do @(for /d %g in ("%f\*") do @(for %h in ("%~g\*") do @move "%~h" "%~f" >nul 2>&1))
Кевин Феган
источник
-1

В проводнике (при условии, что здесь Windows) откройте папку 1_2, выберите все файлы, щелкните правой кнопкой мыши и выберите «Переместить в папку ...», выберите «Папка 1» в диалоговом окне; затем удалите folder1_2, если это было ваше намерение.

Повторите вышеуказанное для всех подпапок, которые вы хотите очистить.

Не нужно никаких внешних программ.

kreemoweet
источник
1
Было бы хорошо, если бы только 10 или около того папок .. Если бы у меня было более 100 папок, мне было бы неудобно делать это (что в моем случае 200+ папок)>, <
Николас Ли