Переместить несколько папок с точным именем в свою родительскую папку - PullRequest
1 голос
/ 08 февраля 2020

У меня есть такая структура файла:

folder
+---a
|   \---b
|       \---foo bar
+---c
|   \---d
|       \---foo bar
+---.
\---.

Я хочу переместить foo bar в свою родительскую папку, используя .

Я пробовал это в , но там говорилось:

The syntax of the command is incorrect.
cd "path to folder"
for /r %x in (foo bar) do move "%x" ".."

Редактировать

Я изменил свою команду на это:

for /r %x in ("foo bar") do move "%x" "%~px.."

Но теперь это дает ошибку, потому что здесь есть пробел между foo и bar: ("foo bar"), что мне делать? используйте foo?bar вместо "foo bar", может быть?

Изменить 2

моя последняя команда:

for /d /r %x in ("?oo bar") do if "%~nx"=="foo bar" move "%x" "%~px.."

Я не использовал (*), потому что это значительно увеличивает время выполнения команды, если у вас есть сотни папок, поскольку он должен проверять каждую папку на предмет ее имени.

Спасибо всем за помощь

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

Я включил приведенные ниже примеры, чтобы не использовать рекурсию, и использую RoboCopy для перемещения. RoboCopy имеет возможность объединять каталоги и перезаписывать / или иным образом (в зависимости от выбранных вами опций) , если будут какие-либо коллизии.

Если вы только движущиеся каталоги с указанным c именем, например, foo bar, тогда может помочь следующая :

(PushD "folder"&&(For /D %G In (*)Do @For /D %H In ("%G\*") Do @RoboCopy "%H\foo bar" "%G\foo bar" /E /Move)&PopD)>NUL 2>&1

Если вы перемещаете все каталоги, независимо от их имена, от трех уровней ниже folder вверх на один уровень, тогда, возможно, этого будет достаточно.

(PushD "folder"&&(For /D %G In (*)Do @For /D %H In ("%G\*") Do @For /D %I In ("%H\*")Do @RoboCopy "%I" "%G\%~nxI" /E /Move)&PopD)>NUL 2>&1

Пожалуйста, обратите внимание, что никакие проверки не были включены, чтобы определить, каталоги второго уровня, которые содержали ваши цели теперь пусты. Если они есть, и вы хотите sh удалить их, вам нужно будет расширить командные строки или добавить новые по мере необходимости.

1 голос
/ 08 февраля 2020
for /r /d %A in (*) do if /i "%~nxA" == "foo bar" move /y "%~A" "%~dpA.."

Использование * в качестве (set). Если вы просматриваете for /?, вы можете увидеть:

(набор) Указывает набор из одного или нескольких файлов. Могут использоваться подстановочные знаки.

Итак, (set) - это файлы, а не папки.

В идеале, для переменной for следует использовать букву, которая не является буквой-модификатором. x представляет модификатор расширения.

%~nxA будет текущим именем папки и проверьте, является ли foo bar.

Если move не удастся, если foo bar уже существует, тогда доступ запрещен для предупреждения о его существовании.

Если используется в пакетном файле, удвойте символы % до %%.

Альтернативный l oop:

for /f "delims=" %A in ('dir /b /s /a:d "*foo bar"') do if /i "%~nxA" == "foo bar" move /y "%~A" "%~dpA.."

, который получает пути до того, как l oop начинает избегать многократного перемещения одной и той же папки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...