5

Обычно я открывал бы родительскую папку и искал * , чтобы выбрать все файлы в подпапках, но в этом случае у меня есть более 1 000 000 файлов, которые мне нужно отсортировать, поэтому мой проводник часто падает при попытке скопировать так много файлы через графический интерфейс. Я не уверен, насколько эффективнее это будет через командную строку или командный файл, но, думаю, стоит попробовать.

Что мне нужно сделать, это сделать так, чтобы

|parent
|    |123
|    |    123abc.png
|    |456
|    |    456def.png
|    |789
|    |    789ghi.png

становится

|parent
|    123abc.png
|    456def.png
|    789ghi.png

Да, моя фактическая файловая структура имеет первые 3 символа имени файла, присвоенного имени папки, если это вообще может помочь в их сортировке.

3 ответа3

12

Используйте FOR /R в командной строке:

[FOR /R] идет по дереву папок, начиная с пути [drive:], и выполняет оператор DO для каждого соответствующего файла.

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

В вашем случае команда будет выглядеть примерно так:

FOR /R "C:\Source Folder" %i IN (*.png) DO MOVE "%i" "C:\Staging Folder"

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

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

После завершения перемещения вы можете переименовать / переместить промежуточную папку по мере необходимости.

СОВЕТ: Если у вас есть свободное место на жестком диске и время под рукой, вы можете воспроизвести его безопасно и копировать файлы, а не перемещать их, на случай, если что-то пойдет не так. Просто измените MOVE на COPY в приведенной выше команде.

1

Это пример кода:

:loop
    for /d %%D in (%1\*) do (move "%%D\*" %1\ && rmdir "%%D")
    SHIFT
    set PARAMS=%1
if not %PARAMS%!==! goto loop

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

«Сдвиг» означает переход к следующему аргументу, когда вы перетаскиваете сразу несколько подпапок в сценарии.

1

Также используйте переменную окружения %% ~ dpi, которая указывает на папку, в которой находятся файлы. Затем вы можете удалить обратную косую черту, которая затем получит родительскую папку файлов. Ниже так и поступает.

SetLocal EnableDelayedExpansion   
FOR /R "C:\Source Folder" %%i IN (*.png) DO (       
       Set "CurrFile=%%~i"     
       Set "TMPdp=%%~dpi"   
       Set "ParFldr=!TMPdp:~0,-1!"    
       @Echo MOVE "%%~i" "!ParFldr!" ) & REM Delete echo to move. Run to test.

! включает динамическое расширение и может использоваться как для %% ~ i, так и для ParFldr. Так что %% ~ я могу быть!CurrFldr! Это на самом деле потребуется во время тестирования, потому что в некоторых файлах будут строки, которые Batch не понравится. Я не имею в виду, что они приведут к сбою сценария и завершению работы. Я просто изменил все %% A на %% i для ясности. Это действительно не имеет значения, если используется буква A или строчная буква i. Что имеет значение, так это постоянное использование одной и той же буквы, поэтому я заменил каждый% %% A на %% i.

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