13

У меня есть куча папок внутри папок. Как это

Root Folder
    -- Folder 1
    -- Folder 2
    -- Folder 3
    -- Folder 4

Я хочу свернуть все папки, чтобы все файлы в папке 1, папке 2, папке 3, ... папке n существовали в корневой папке.

Какой самый быстрый способ сделать это в Windows?

3 ответа3

16

Нет причин использовать специальные инструменты или даже сценарии. Просто используйте функцию поиска в проводнике.

  1. Откройте папку, которую вы хотите сгладить в проводнике.
  2. Создайте новую папку, выберите все файлы (но не папки) и перетащите их в эту папку (это позволит избежать получения двух копий этих файлов).
  3. В поле поиска (поле справа от адресной строки) введите * и нажмите Enter.
  4. После того, как список заполнится, щелкните правой кнопкой мыши и выберите все, затем щелкните правой кнопкой мыши и выберите Cut.
  5. Нажмите кнопку «Назад», чтобы вернуться в исходную папку, затем щелкните правой кнопкой мыши и вставьте.
  6. Если у вас есть повторяющиеся имена, вам будет предложено, как с этим бороться. Выберите наиболее подходящий вариант для вашего варианта использования. (Я предполагаю, что это будет копировать оба файла.) Чтобы избежать повторного запроса, обязательно примените это ко всем файлам с флажком внизу.
  7. Выберите все папки, убедитесь, что они пусты, посмотрите во всплывающем окне количество выбранных файлов, а затем удалите их.

Если вы предпочитаете иметь сценарий, чтобы вы могли просто запустить его и забыть, это тоже можно сделать. Команда для замены mv *\* . это довольно легко (for /r %f in (*.*) do @move "%~f" .) но я уверен, что вы хотели бы обрабатывать дубликаты, не оставляя их позади, как в ответе @Nicole Hamilton. Добавление числа к имени файла дубликатов, вероятно, самый простой способ сделать это.

Скопируйте и вставьте следующий пакетный файл в Блокнот и сохраните его как «flatten.cmd» (включая кавычки):

@echo off
cd "%~1"
md tempryfolder
move *.* tempryfolder
for /r %%f in ("*.*") do call :START "%%~f"
for /r /d %%f in (*.*) do rd "%%~f" 
GOTO :EOF
:START
setlocal
If exist "%~n1%~x1" set /a num=2
:LOOP
If exist "%~n1%num%%~x1" (
    set /a num+=1
    goto loop
)
move "%~1" "%~n1%num%%~x1"

Чтобы использовать сценарий, просто перетащите папку, которую вы хотите расправить, поверх нее.

3

Вы можете сгладить в проводнике Windows, перейдя в папку, которую вы хотите сгладить и поиска System.Kind:<>folder чтобы исключить папки из результатов.

Затем вы можете выбрать все файлы с помощью сочетания клавиш CTRL+A, скопировать и вставить их в новую папку. Обратите внимание, что Windows Explorer спросит вас, как обращаться с дублирующимися именами файлов.

0

Это легко сделать с помощью оболочки Unix. Вот что вы можете сделать с моей собственной оболочкой Hamilton C (включая бесплатную версию ). Вы можете сделать что-то очень похожее с Cygwin Bash.

mv *\* .

Если ваша директория действительно огромна, возможно, что в командной строке слишком длинный символ, который Windows не сможет передать дочернему процессу. (Вызов Windows CreateProcess ограничивает список аргументов символами Unicode 32K.) Но оболочка C не имеет внутренних ограничений, поэтому вы можете перебирать весь список следующим образом:

foreach i ( *\* )
   mv $i .
end

К @ MarkAllen выше, этот вид предполагает, что нет повторяющихся имен. Если таковые имеются, более поздние копии в списке перезапишут более старые. Если это проблема, вы можете перебирать файлы, mv их, только если не перезаписываете. Оператор :t является оператором хвоста. Оператор -e - это файл существует тест.

foreach i ( *\* )
   if ( -e $i:t ) then
      echo -2 $i not moved because it already exists
   else
      mv $i .
   end
end

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

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