Как я могу массово перенести определенные папки из большого числа папок, если я знаю их названия?

Здравствуйте! У меня есть несколько сотен папок на диске, содержащих вложенные файлы. Мне нужно переместить определенные папки вместе со всем их содержимым в другую директорию. Имена этих папок мне известны. Я уже пробовал использовать Total Commander и командную строку, но безуспешно. Есть ли эффективный способ сделать это и можете ли вы предоставить подробные инструкции?
  • 16 декабря 2024 г. 6:33
Ответы на вопрос 2
Здравствуйте! Для массового переноса определённых папок с известными именами вам может помочь использование командной строки Windows или PowerShell. Ниже я приведу инструкции по обоим способам.

### Способ 1: Использование командной строки

1. **Откройте командную строку**:
   - Нажмите `Win + R`, введите `cmd` и нажмите `Enter`.

2. **Используйте команду `xcopy`**:
   Чтобы скопировать нужные папки, используйте следующую команду:

   ```cmd
   xcopy "C:\ИсходнаяПапка\ИмяПапки1" "C:\ЦелеваяПапка\ИмяПапки1" /E /I
   xcopy "C:\ИсходнаяПапка\ИмяПапки2" "C:\ЦелеваяПапка\ИмяПапки2" /E /I
   ```

   Разделите команды для каждой папки. Параметры:
   - `/E` — копировать все подкаталоги, включая пустые.
   - `/I` — если целевая папка не существует, создать её.

3. **Если папки находятся в разных местах**:
   Если вам нужно искать папки в различных внутренних директориях, добавьте цикл:

   ```cmd
   for /d %f in (C:\ИсходнаяПапка\*) do (
       if exist "%f\ИмяПапки1" (
           xcopy "%f\ИмяПапки1" "C:\ЦелеваяПапка\ИмяПапки1" /E /I
       )
       if exist "%f\ИмяПапки2" (
           xcopy "%f\ИмяПапки2" "C:\ЦелеваяПапка\ИмяПапки2" /E /I
       )
   )
   ```

### Способ 2: Использование PowerShell

1. **Откройте PowerShell**:
   - Нажмите `Win + R`, введите `powershell` и нажмите `Enter`.

2. **Используйте команду `Copy-Item`**:
   Пример команды для переноса:

   ```powershell
   $source = "C:\ИсходнаяПапка"
   $destination = "C:\ЦелеваяПапка"
   $foldersToMove = "ИмяПапки1", "ИмяПапки2"

   foreach ($folder in $foldersToMove) {
       $sourcePath = Join-Path -Path $source -ChildPath $folder
       $destPath = Join-Path -Path $destination -ChildPath $folder

       If (Test-Path -Path $sourcePath) {
           Copy-Item -Path $sourcePath -Destination $destPath -Recurse -Force
       }
   }
   ```

   В этом коде:
   - Задайте исходную и целевую директории.
   - Укажите имена папок в массиве `$foldersToMove`.

3. **Поиск по всем вложенным директориям**:
   Если нужно искать везде, используйте:

   ```powershell
   $source = "C:\ИсходнаяПапка"
   $destination = "C:\ЦелеваяПапка"
   $foldersToMove = "ИмяПапки1", "ИмяПапки2"

   foreach ($folder in $foldersToMove) {
       Get-ChildItem -Path $source -Recurse -Directory -Filter $folder | ForEach-Object {
           $destPath = Join-Path -Path $destination -ChildPath $_.Name
           Copy-Item -Path $_.FullName -Destination $destPath -Recurse -Force
       }
   }
   ```

Этот код рекурсивно ищет папки по всем подкаталогам исходной директории и копирует их в целевую директорию.

### Примечания
- Убедитесь, что у вас есть права на чтение и запись в указанных директориях.
- Проверяйте пути и имена папок на предмет опечаток.
- Перед выполнением команд вы можете протестировать их на тестовых данных, чтобы удостовериться, что всё работает корректно. 

Если у вас остались вопросы или требуется дополнительная помощь, не стесняйтесь спрашивать!
Что именно делали через командную строку и что не получилось? 
Так-то find в помощь.
Насколько длинный список имён папок, которые надо переместить?

Как направление:
find . type d -name "имя папки" >>/tmp/list
Повторяем для каждого имени. Если список имён большой, оформляем через цикл for
Потом с помощью sed/vi/другой редактор дописываем в начало строки mv, в конце папку куда переместить.
Проверяем, что нет имён с пробелами. Их заключаем в одинарный кавычки. (ну или сразу все имена заключить в кавычки)
Запускаем полученный скрипт.

Всё это можно завернуть сразу в один скрипт, но если что-то пойдёт не по плану, данные можно и не найти.
И даже в текущем запуске через скрипт, есть риск конфликтов имён и перезаписи файлов...
Похожие вопросы