Как мне переместить каждый файл в дереве в корень дерева?

10

У меня есть папка (назовем это A) с множеством подпапок B, C, D, E, в которых снова есть подпапки B1, B2, B3, ... C1, C2, C3 ...

Как с помощью cmd переместить все файлы из всех подпапок в «корневую» папку A?

ладья
источник
Я предполагаю, что вы хотите, чтобы каждый файл был в одном корне, а не в подпапках? Таким образом, A \ File1, A \ File2, а не A \ Folder2 \ File1?
канадский Люк
@ Люк - Да, ты понял. Каждый файл, который существует в папках и подпапках, перемещается в корневой каталог.
Ладья

Ответы:

12

В моем исходном сообщении не указывалось расширение файла в команде перемещения. %~niвозвращает только базовое имя, вы должны использовать, %~nxiчтобы получить как имя файла, так и расширение! Я надеюсь, что вы не испортили свои имена файлов в моем аккаунте! (

Из командной строки:

cd /d C:\Path\To\A
for /r %i in (*) do @move "%i" "%~nxi"

Если вам нужно очистить пустые папки потом:

for /d %i in (*) do @rd /s /q "%i"

Теперь, если у вас есть какие-либо конфликты имен файлов, вы сами по себе. Вы можете добавить /yпараметр в moveкоманду (перед "%i") для принудительной перезаписи. Если вы хотите что-то другое, вам понадобится другая программа, которая может автоматически переименовать все для вас.

Кроме того , если вы хотите использовать это в пакетном файле, изменить все %к %%.

afrazier
источник
Не знал о FOR /r- приятно!
Даниэль Бек
Вау, очень круто. Я преклоняюсь перед вашей командой-фу.
Мокубай
2

Создайте папку и скопируйте в нее все остальные папки, затем щелкните правой кнопкой мыши по этой папке и выберите « Поиск» . В поле поиска введите *.*.

Это перечислит все файлы и папки. Выберите все файлы, которые вы хотите в вашем корневом каталоге и вырезать их. Перейдите в корневой каталог и вставьте туда все файлы.

Ричард
источник
поиск не существует как команда в моем cmd.
Ладья
Ричард не говорил о команде. Отредактировал его ответ, чтобы сделать его более понятным.
Исаак Рабинович
0

Установите Cygwin (или другую среду Unix для Windows) и выполните следующее:

cd A
find . -type f -exec mv {} . \;
Даниэль Бек
источник
В зависимости от вашего mvи findвариантов, вы можете использовать find . -type f -exec mv -t . {} \;вместо этого.
Даниэль Бек
1
Для собственных портов Windows многих инструментов Unix мне нравится unxutils.sourceforge.net
Деннис,
@Dennis UnxUtils хорошие, к сожалению, довольно старые. Если вы используете их в настоящее время, не могли бы вы проверить, работает ли мой пост с ними? mkdir -p a/a1 a/a2 a/a3 b/b1 b/b2 b/b3 cи touch a/a1/foo a/a1/bar a/a2/baz a/a3/qux b/b1/quux b/b2/quuux b/b3/quuuux c/cccдля подготовки.
Даниэль Бек
-1 Это может быть правдой, но я спрашивал, как это сделать в cmd.
Ладья
@ Даниэль Без сомнения, они старые, я тащил их годами. Я только что попробовал, find . -type f -exec mv {} . ;и, кажется, все в порядке.
Деннис