Я хочу полуавтоматически копировать и классифицировать файлы DCIM со своего iPhone на мой компьютер, храня вместе "связанные" изображения камеры и отдельно от скриншотов, загруженных файлов JPEG, GIF, MPEG, PNG и т.д.

На моем iPhone у меня есть куча загруженных изображений (из Pinterest, Tumblr и т.д.). У меня также есть куча связанных изображений jpg/mp4, сделанных камерой iPhone, которые находятся в связанных парах, одна за другой в порядке имен файлов. Очевидно, что камера iPhone записывает как JPEG-изображение, так и многокадровый MP4-фильм для каждого снятого изображения. Загруженные изображения - только отдельные JPEG, GIF, MP4 и т.д.

Я хотел бы, чтобы скрипт находился на локальном компьютере и запускался вручную после того, как iPhone был смонтирован.

Пути к изображениям iPhone:«mtp:// iPhone Скотта / Внутренняя память / DCIM / 291APPLE», «mtp:// iPhone Скотта / Внутренняя память / DCIM / 292APPLE», «mtp:// iPhone Скотта / Внутренняя память / DCIM» / 293APPLE 'и т.д.

У меня нет контроля над именами подкаталогов (такими как 291APPLE, 292APPLE, 293APPLE и т.д., Но они всегда начинаются с (на первый взгляд случайного) трехзначного числа и всегда заканчиваются на "APPLE". Там может быть один или десять. Это зависит только от iOS и количества файлов. Подкаталоги доступны только для чтения, но сами файлы предназначены для чтения и записи, поэтому их можно удалить позже.

Итак, мне нужно рекурсивно работать со всеми файлами вплоть до «mtp:// iPhone Скотта / Внутреннее хранилище / DCIM /».

Список каталогов в каждой подпапке на iPhone выглядит примерно так:

*image001.jpg* <-- downloaded *image002.jpg* <-- downloaded *image003.jpg* <-- camera image a *image004.mp4* <-- camera image b *image005.jpg* <-- downloaded *image006.jpg* <-- downloaded *image007.jpg* <-- downloaded *image008.jpg* <-- downloaded *image009.jpg* <-- camera image a *image010.mp4* <-- camera image b *image011.jpg* <-- downloaded

Таким образом, файлы 003 и 004 связаны, а файлы 009 и 010 связаны. Все файлы в iPhone/DCIM/* Скотта имеют уникальные имена.

Я хотел бы скопировать только связанные изображения в каталог A, а остальные изображения (загружаемые файлы любого типа: jpg, gif, mp4 и т.д.) В каталог B.

Может ли кто-нибудь помочь с логикой и кодом Powershell, которые сделали бы это возможным? Я действительно не знаю, как этого добиться. Может быть, есть лучший способ или утилита, которую кто-то уже написал? Если так, я был не в состоянии найти это, и иметь дело с сотнями изображений за один раз действительно утомительно. Это похоже на идеальное приложение для Powershell.

Я думаю, что мне нужно перебрать файлы, определить первый файл * .mp4, поместить имя файла в переменную, скопировать файл * .mp4 в каталог A, а затем вычесть значение 1 из переменной, чтобы соответствовать предыдущему связанному * .jpg имя файла в алфавитном порядке и скопировать его в каталог А.

Промыть и повторить.

Затем скопируйте оставшиеся несвязанные файлы (любого типа) в каталог B.

Итак, в итоге у меня следующая структура каталогов:

On the iPhone:  

(leave the original files as is)  

Directory A  

image003.jpg    <-- camera image a  
image004.mp4    <-- camera image b  
image009.jpg    <-- camera image a  
image010.mp4    <-- camera image b  

Directory B  

image001.jpg    <-- downloaded  
image002.jpg    <-- downloaded  
image005.jpg    <-- downloaded  
image006.jpg    <-- downloaded  
image007.jpg    <-- downloaded  
image008.jpg    <-- downloaded  
image011.jpg    <-- downloaded 

Наконец, спросите пользователя, хотят ли они удалить оригиналы iPhone (я могу обработать эту часть, я думаю), но не каталоги iPhone (проблема разрешений, упомянутая выше ... iOS заботится о структуре каталогов).

Думаю, есть одна проблема: загруженный фильм, заканчивающийся * .mp4, будет сопоставлен с несвязанным файлом * .jpg, который был загружен только ранее. Если у кого-то нет элегантного способа справиться с этим. Я могу жить с этим небольшим ограничением. Я заметил, что связанные файлы jpg/mp4 имеют одинаковую метку времени hh: ss, если это поможет. Загруженные изображения / фильмы / гифки никогда не совпадают по времени. Может быть, сопоставить метки времени проще? Не знаю, как этого добиться.

Меня действительно смущает обработка переменных имени файла, математической логики -1 при работе с именами файлов и способов обработки оставшихся имен файлов (в массиве или с помощью итераций?). Копирование, перемещение, сопоставление имен и т.д. Я думаю, что могу работать методом проб и ошибок, но не стесняйтесь уточнять. То, что некоторые могут сделать на лету, занимает у меня часы, часто заканчиваясь неудачей и разочарованием :-(

Кто-нибудь может помочь? Мои навыки Powershell примерно до 3-й главы, так что я действительно изо всех сил.

2 ответа2

0

Попробуйте это и держите нас в курсе, работает ли он или нет:

Изменить: я забыл искать в каждом каталоге. Должно быть исправлено сейчас.

$directoryA = "%userprofile%\Pictures\Directory A"
$directoryB = "%userprofile%\Pictures\Directory B"
$items = Get-ChildItem ".\\image*"  -Recurse | ForEach-Object { if (!($_.PSIsContainer)) { $_}}
$i = 0
$mp4s = @()
$associatedImgs = @()
 ForEach($item in $items) {
    If(($items[$items.IndexOf($item)].Extension).Equals(".mp4")) {
        $mp4s += $i
        $associatedImgs += $i - 1
        }
    $i += 1
}

ForEach($mp4 in $mp4s) {
    Copy-Item -Path $items[$mp4].FullName -Destination $directoryA -Force -PassThru -Verbose
    Copy-Item -Path $items[$mp4 - 1].FullName -Destination $directoryA -Force -PassThru -Verbose

}
ForEach($item in $items) {
    If($mp4s.Contains($items.IndexOf($item))){

    } ElseIf($associatedImgs.Contains($items.IndexOf($item))) {

    } Else {
        Copy-Item -Path $items[$item].FullName -Destination $directoryB -Force -PassThru -Verbose

    }
}
0

Если время создания пар .mp4 / .jpg является надежным,
Вы можете попробовать сгруппировать файлы по этому свойству:

Get-ChildItem -Recurse -include '*.htm','*.ps1'|
  Group-Object Creationtime|
    ForEach-Object {If($_.Group.Count -eq 2){$_.Group.Fullname;"---"}}

Это будет выводить только пары двух совпадающих времен для проверки.

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