Пакетное перемещение содержимого папки на один уровень вверх

В некоторых случаях это простая задача, но у меня есть тысячи файлов в сотнях папок, которые я хочу переместить вверх.

Структура каталогов выглядит следующим образом:

C:\Photos\subject\randomnumbers\images\file.ext

И я хочу закончить с:

C:\Photos\subject\randomnumbers\file.ext

Я пробовал бегать for /r %i in ("*\images\*.*") do move *\*.* но это не работает, как ожидалось.

Я не могу придумать другой способ сделать это, кроме как сделать это вручную. Хотя выполнение этого вручную будет работать, я бы очень выиграл от автоматизированной операции, которую я могу запустить по мере необходимости.

Это возможно, и кто-нибудь может мне помочь с этим?

3 ответа

Решение

Это должно работать для вас:

for /r %i in ("images\*.*") do move %i %~pi..
  • %~pi извлекает путь из %i (заканчивая \)
  • .. после указанного выше пути указывает на родительский каталог

Конечно, это не обрабатывает ситуацию, когда у вас есть файлы с конфликтующими именами в подкаталогах.

Это не очень сложно, и я уверен, что люди придумают лучшие решения, но вот быстрое:

  1. Сделайте простой (Explorer) поиск *, начиная с папки, в которую вы хотите переместить материал. Это может занять полминуты или около того, чтобы завершить.
  2. Сортировать результат по пути
  3. Выберите все файлы (которые вы хотите переместить), которые еще не находятся в целевой папке (это будут ваши существующие "тысячи каталогов". Они будут все вместе после сортировки, поэтому "нажмите" и "shift+" нажмите 'делает это.
  4. Перетащите их в дерево структуры папок слева и поместите в целевую папку.
  5. Получить кофе или сделать другую работу, пока он движется. Windows обычно может перемещать 40 - 7000 файлов в секунду, в зависимости от вашего оборудования.
  6. Выберите все - теперь пустые - каталоги и удалите их.

Обратите внимание, что вы также можете выполнить шаг 1 с фильтрами, если вы хотите, чтобы только определенные типы файлов, например *.jpg,*.png,

Пакетное перемещение содержимого папки на один уровень вверх

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

Переместить все папки и файлы в MoveFromDir и ниже в MoveToDir

Обратите внимание, что работает только второй цикл FOR:

  • FOR /F "TOKENS=*" %%A IN ('DIR /S /B "%MoveFromDir%\*.jpg"')

Вы можете указать только те расширения файлов, которые вы хотите переместить в MoveToDir (например, jpg)

@ECHO ON

SET MoveToDir=C:\Photos\subject\randomnumbers
SET MoveFromDir=C:\Photos\subject\randomnumbers\images

:: Move the folders from the move directory to the move to directory
FOR /D %%A IN ("%MoveFromDir%\*") DO MOVE /Y "%%~A" "%MoveToDir%"

:: Move any remaining files (or folders) from the move directory to the move to directory
FOR /F "TOKENS=*" %%A IN ('DIR /S /B "%MoveFromDir%\*.*"') DO MOVE /Y "%%~A" "%MoveToDir%\"
GOTO EOF

Дополнительные ресурсы

PowerShell:

$source = 'C:\Photos\subject\randomnumbers\images'

Get-ChildItem $source -file | move-item -Destination {$_.Directory.Parent.Fullname}

Используйте подстановочные знаки для обработки всех случайных чисел:

$source = 'C:\Photos\subject\*\images'

Get-ChildItem $source -file | move-item -Destination {$_.Directory.Parent.Fullname}

Я нашел другой способ сделать это... это занимает больше времени и места на жестком диске, но это позволяет вам делать это, не зная имя каталога самого низкого уровня. Таким образом, вместо того, чтобы знать, что папка самого низкого уровня называется "images", она может быть буквально любой.

Например, у меня было несколько папок, скажем, они названы 1, 2, 3, 4, 5 и т. Д., И внутри всех этих папок было больше папок, содержащих файлы. Я хотел переместить все файлы в любой данной корневой папке (1, 2, 3, 4, 5 и т. Д.) В эту папку верхнего уровня (1, 2, 3, 4, 5 и т. Д.). Я обнаружил, что используя WinRAR, я могу сжать все эти папки верхнего уровня (1, 2, 3, 4, 5 и т. Д.), Используя "хранилище" для сжатия, чтобы минимизировать время обработки. Затем я просто разархивировал их с помощью меню правой кнопки мыши снова "извлечь каждый архив в отдельную папку". Перед тем как распаковать, мне пришлось "сохранить настройки" в WinRAR с настройкой "Извлечь -> Расширенное меню -> Пути к файлам": "Не извлекать пути", и каждый файл ZIP был разархивирован в свою папку со всеми файлами внутри (как бы не было папок / подпапок внутри) на верхнем уровне.

Я успешно сделал это с 2350 папками одновременно, и это прекрасно работает. Теперь я использую это каждую неделю или около того.

Другие вопросы по тегам