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

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

4 ответа4

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, чтобы скрипт работал .

2

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

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

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

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

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

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, если это было вашим намерением.

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .