Переместить файлы в папку, названную частью их имени файла

330
Florian Frey

У меня есть файлы с камеры GoPro Fusion, которые представляют изображения и фильмы. Имена файлов выглядят как

GP (для «GoPro»)  (еще две буквы не имеют особого значения)  (серия цифр; возможно, четыре или шесть цифр)  .  (точка)  (продление)

Некоторые из расширений являются общими из них, как JPG, MP4, и WAV; другие необычны. Некоторые примеры имена файлов GPFR0000.jpg, GPBK0000.jpg, GPFR0000.gpr, GPFR1153.MP4, GPFR1153.THMи GPBK142857.WAV. Но расширения не имеют отношения к этому вопросу.

Для каждого изображения и фильма есть набор файлов, имена которых имеют одинаковые серии цифр непосредственно перед расширением. Так, например, GPFR1153.LRVи GPBK1153.MP4 принадлежат к одному и тому же набору.

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

GPFR0000.jpg GPBK0000.jpg GPFR0000.gpr GPFR0000.gpr GPFR1153.LRV GPFR1153.MP4 GPFR1153.THM GPBK1153.WAV GPBK1153.MP4 GPQZ142857.FOO 

все в одном каталоге, результат должен быть

GP0000\GPFR0000.jpg GP0000\... GP1153\GPFR1153.LRV GP1153\GPFR1153.MP4 GP1153\... GP142857\GPQZ142857.FOO 

Возможно ли это с помощью скрипта (для Windows 10)? Я обнаружил этот (PowerShell) сценарий mousio в Recursively перемещении тысяч файлов в окна подпапок, но он решает немного другую проблему, и я хотел бы помочь адаптировать его к моим требованиям (я художник, а не программист).

# if run from "P:\Gopro\2018", we can get the image list $images = dir *.jpg  # process images one by one foreach ($image in $images) { # suppose $image now holds the file object for "c:\images\GPBK1153.*"  # get its file name without the extension, keeping just "GPBK1153" $filenamewithoutextension = $image.basename  # group by 1 from the end, resulting in "1153" $destinationfolderpath =  $filenamewithoutextension -replace '(....)$','\$1'  # silently make the directory structure for "1153 GPBK1153" md $destinationfolderpath >$null  # move the image from "c:\images\1234567890.jpg" to the new folder "c:\images\1\234\567\890\" move-item $image -Destination $destinationfolderpath  # the image is now available at "P:\Gopro\2018\1153\GPBK1153.*" } 
2
(1) Ваш скрипт показывает имена файлов, которые выглядят как имена файлов Windows. Вы используете Windows? Пожалуйста, [отредактируйте] свой вопрос, чтобы сказать так, указав версию, как в теле вопроса, так и в тегах. (2) Вы говорите, что ваши файлы следуют шаблону, и вы показываете несколько примеров, но вы не объясняете это. Вы показываете имена файлов, которые состоят из четырех букв, четырех цифр, точки и трехбуквенного расширения. Является ли шаблон, что все файлы с одинаковыми четырьмя цифрами связаны? Итак, `BLUE1742.FOO` и` IRON1742.BAR` идут вместе? … (Продолжение) Scott 3 года назад 0
(Продолжение)… (3) Пожалуйста, объясните желаемый результат. (Название вашего вопроса намекает на ваши цели, но вы не даете подробностей.) (4) Где вы взяли этот сценарий? Если кто-то другой написал это, вы должны указать источник. (5) Где остальная часть сценария? Вы показываете `{` но нет `}`, поэтому вы пропускаете часть. (6) Какой у вас вопрос? (7) Почему вы не просите автора сценария о помощи? …………………………………………………………………………………………………………………………………………………………. Пожалуйста, не отвечайте в комментариях; [отредактируйте] ваш вопрос, чтобы сделать его более понятным и полным. Scott 3 года назад 0
(1) да Win 10 (2) да 4 цифры в редких случаях больше (6) (3) структура папок, содержащая каждый набор изображений с именованной папкой по цифрам (4), (5) источник был добавлен Извините (6) вы могли бы помочь я делаю этот сценарий (7) я не знаю почему. Я просто подумал, что это правильный путь, так как есть много других людей, которые используют эту камеру и должны решить эту проблему. извините, я просто прогуглил это и попытался найти ответы ... пожалуйста, не обижайтесь. Я могу, конечно, удалить это, если это не подходит. Florian Frey 3 года назад 0
Я не обиделась; Извините, если я произвел на вас такое впечатление. Проблема в том, что мы не можем читать ваши мысли и не можем ответить на ваш вопрос, если не понимаем, чего вы хотите. Кроме того, копирование чего-либо, написанного кем-то другим, без идентификации оригинального автора, даже в семействе [SE], считается плагиатом и строго запрещено. … (Продолжение) Scott 3 года назад 0
(Продолжение) ... Хотя я не обижаюсь, я расстроен, потому что я спросил вас, какой результат вы хотели, и вы дали мне два разных ответа. Ваш комментарий говорит, что вы хотите, чтобы файлы были перемещены в каталог (папку), имя которого является цифрами от имени файла, а комментарии к примеру, которые вы поместили в скрипт, говорят, что вы хотите, чтобы файлы `` `GPBK1153. *` `` Были перемещены в каталог. `1153`. Но в своих примерах в начале вопроса вы говорите, что имя каталога должно быть `GP1152`. (И тот факт, что вы переключились с «1152» на «1153», смутил меня на мгновение.)… (Продолжение) Scott 3 года назад 0
(Продолжение)… Я предположил, что вы хотите, чтобы имя каталога было `` `GP```, за которым следовали цифры; дайте мне знать, если это не так. ** Обновление: ** Я сделал большое редактирование на ваш вопрос. Опять же, дайте мне знать, если я ошибаюсь. Scott 3 года назад 0

1 ответ на вопрос

0
Scott

Исходя из моего (возможно, ошибочного) понимания того, что вы хотите, вы можете сделать это с помощью следующего скрипта PowerShell. Обратите внимание, что это происходит от работы mousio, опубликованной в Recursively, перемещающей тысячи файлов в окна подпапок .

# If run from "P:\Gopro\2018", we can get the file list. $images = dir GP*  # Process files one by one. foreach ($image in $images) { # Suppose $image now holds the file object for "P:\Gopro\2018\GPBK1153.FOO"  # Get its file name without the extension, keeping just "GPBK1153". $filenamewithoutextension = $image.basename  # Grab the first two characters (which we expect to be "GP"), # skip the next two characters (which we expect to be letters; e.g., "BK"), # then grab all the characters after that (which we expect to be digits; e.g., "1153") # and put them together, resulting in "GP1153". $destinationfolderpath =  $filenamewithoutextension -replace '(..)..(.*)','$1$2'  # Silently make the directory structure for "GP1153". md $destinationfolderpath > $null 2>&1  # Move the file from "P:\Gopro\2018\GPBK1153.FOO" to the new folder "P:\Gopro\2018\GP1153" move-item $image -Destination $destinationfolderpath  # The file is now available at "P:\Gopro\2018\GP1153\GPBK1153.FOO". }