Згладити структуру каталогів


15

У мене є папка в папках. Подобається це

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

Я хочу згорнути всі папки, щоб усі файли в папці1, папці 2, папці 3, ... папці n існували під кореневою папкою.

Який найшвидший спосіб зробити це у Windows?


5
Це залежить від того, як би ви хотіли обробити дублікати імен файлів?
Марк Аллен

Відповіді:


19

Немає підстав використовувати спеціальні інструменти або навіть сценарії. Просто скористайтеся функцією пошуку в Провіднику.

  1. Відкрийте папку, яку ви хочете вирівняти в Провіднику.
  2. Створіть нову папку, виберіть усі файли (але не папки) та перетягніть їх у цю папку (це дозволить уникнути отримання двох копій цих файлів.)
  3. У полі пошуку (праворуч від адресного рядка) введіть *і натисніть клавішу Enter.
  4. Після того, як список заповниться, клацніть правою кнопкою миші та виберіть усе, потім клацніть правою кнопкою миші та Виріжте.
  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"

Щоб використовувати сценарій, просто перетягніть папку, яку ви хочете розрівняти поверх неї.


1
Подібні, але простіші для розуміння: superuser.com/a/523854/433830
aparente001

Примітка: цей скрипт по суті є вилковою бомбою. Я використовую його в папці з тисячами підкаталогів і десятками тисяч підфілів, і слід пам’яті повільно збільшується. Я не думаю, що я збираюся стикатися з проблемами ООМ, але це потрібно пам’ятати.
Nzall

@Nzall У мене немає проблем вірити, що це може зробити, але я звинувачую Microsoft, а не свій код. Все, що я роблю, - це викликати підпрограму в пакетному файлі кілька разів. І я ніколи не запускаюсь більше ніж один за один раз: кожна підпрограма працює до завершення, запускаючи лише один процес за один раз. Скільки пам’яті ми говоримо про використання?
trlkly

@trlkly В один момент він збільшився до 2 ГБ, хоча у мене була досить велика кількість папок і папок, близько 75 000 файлів і тисяч папок. Через кілька моментів вона знизилася до рівня приблизно 8-900 МБ. Однак було багато дублікатів файлів. Я розгладжував 12 примірників бібліотеки Javascript з файлом 7500 файлів, щоб я міг перевірити, як певне програмне забезпечення обробляє папку з десятками тисяч файлів.
Nzall

@Nzall Це неймовірно дивно для мене. Нічого сценарій не повинен робити цього. Це одна підпрограма, яка повторно використовує одну змінну для збільшення файлу. Можливо, мені доведеться запитати, що може спричинити таке велике використання пам'яті на SO або щось таке.
trlkly

11

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

Потім можна вибрати всі файли за допомогою CTRL + A і скопіювати та вставити їх у нову папку. Зауважте, що Провідник Windows запитає вас, як поводитися з повторюваними іменами файлів.

введіть тут опис зображення


1
зауважте, що для цього вам потрібно набрати "папку" у відповідному локалізованому перекладі (наприклад, італійською мовою System.Kind:<>cartella)
JohnKiller

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

Це все ще залишає порожні каталоги, які, можливо, ви не хочете після їх спорожнення. Це може бути наступна ітерація, якщо вона має значення.


Використовуючи cygwin> mv *. mv: не може стати статикою * * : Немає такого файлу чи каталогу
Більше п’яти

У Cygwin bash, mv */* .працює для мене.
Ніколь Гамільтон

3
Деякі люди настільки зафіксовані в UNIXism ... Якщо ви дійсно хочете робити сценарії в Windows 7, є PowerShell, вам не потрібен якийсь фальшивий симулятор башти, як Cygwin.

Вам навіть не потрібен PowerShell. Звичайний командний рядок все ще існує і може робити те ж саме. Дивіться мою відповідь нижче.
trlkly
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.