Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Оставить рандомный файл в папках (http://forum.oszone.net/showthread.php?t=332266)

MI-5 02-01-2018 08:54 2788511

Оставить рандомный файл в папках
 
Добрый день. Помогите пожалуйста. Требуется рукурсивно оставить в подпапках один рандомный файл (все файды - jpg), а остальные удалить. Желательно, но не обязательно, с указанием корневой папки. То есть, указываем имя папки и изо всех подпапок удаляются все файлы кроме одного рандомного. Заранее спасибо.

Iska 02-01-2018 09:05 2788512

MI-5, глубинный смысл сего действа?

MI-5 02-01-2018 09:16 2788514

Iska, Есть десять тысяч папок, в каждой по сто-двести файлов. Надо оставить по одному примеру изображения из каждой папки, а остальные удалить. А просматривать миллион изображений вручную нет никакого ни желания, ни времени.

Iska 02-01-2018 09:56 2788518

MI-5, это ни о чём. Зачем в таком случае нужно вообще что-то оставлять?! Shift-Del, и дело с концом.

Пока что неубедительно.

MI-5 02-01-2018 10:02 2788519

Iska, Ну проблема у меня такая. Надо мне оставить один файл в каждой подпапке. Чтобы нажать Shift+Del, надо зайти в каждую из десяти тысяч папок, нажать Ctrl+A, а потом снять выделение с одного файла, а уж только после всего этого нажать Shift+Del. Это то же самое, что вручную просмотреть все эти папки. Я не пытаюсь никого ни в чём убедить - зачем мне это надо? Мне надо решить стоящую передо мной проблему - я спросил здесь.

Я нашёл решение, позволяющее переместить рандомный файл из папки в другую папку: mix2stix. Но это не рекурсивно и мне надо в дальнейшем каждый оставшийся файл переименовать в название родительского каталога. Но это уже в дальнейшем вручную будет. Сейчас же вопрос стоит как оставить один файл в папке.

Iska 02-01-2018 10:38 2788531

Цитата:

Цитата MI-5
Iska, Ну проблема у меня такая. »

Цитата:

Цитата MI-5
Я не пытаюсь никого ни в чём убедить - зачем мне это надо? Мне надо решить стоящую передо мной проблему - я спросил здесь. »

MI-5, проблема у Вас с тем, что Вы уже выбрали решение для неизвестной задачи, каковое и озвучили. Саму задачу описывать не хотите, зачем надо — не пишете, отделываясь общими фразами.

Цитата:

Цитата MI-5
Чтобы нажать Shift+Del, надо зайти в каждую из десяти тысяч папок, »

Я не предлагал Вам ходить по десяти тысячам папок. Я предлагал нажать Shift-Del на головной папке, и закрыть проблему парой нажатий клавиш в целом: какая разница — оставлять по одному случайному файлу, или не оставлять вовсе.

MI-5 02-01-2018 10:48 2788532

Я делаю раздачу на трекер. По одному файлу в каждой папке надо для примеров.
Цитата:

Цитата Iska
Я предлагал нажать Shift-Del на головной папке, и закрыть проблему парой нажатий клавиш в целом: какая разница — оставлять по одному случайному файлу, или не оставлять вовсе. »

Тут даже сказать нечего.

Iska 02-01-2018 12:14 2788542

Цитата:

Цитата MI-5
Я делаю раздачу на трекер. По одному файлу в каждой папке надо для примеров. »

Предлагаю сделать иное, нежели удаление. А именно — воссоздать всю структуру каталогов в отдельном каталоге того же раздела, затем создать по одной жёсткой ссылке в каждом каталоге-дубликате на файл из оригинального каталога. Таким образом, дополнительного места эти файлы занимать не будут.

На PowerShell:
Скрытый текст
Код:

$sSourceFolder = 'C:\Мои проекты\0142'
$sDestFolder  = 'C:\Мои проекты\0143'

if(Test-Path -Path $sSourceFolder -PathType Container) {
    @(Get-Item -Path $sSourceFolder) + (Get-ChildItem -Path $sSourceFolder -Directory -Recurse) | `
        ForEach-Object -Process {
            $cFiles = $_.GetFiles()
           
            if($cFiles.Count -gt 0) {
                $sNewFolder = $_.FullName.Replace($sSourceFolder, $sDestFolder)
                $oNewFolder = New-Item -ItemType Directory -Path (Split-Path -Path $sNewFolder -Parent) -Name (Split-Path -Path $sNewFolder -Leaf)
               
                $oFile = $cFiles[$(Get-Random -Maximum ($cFiles.Count - 1))]
                New-Item -ItemType HardLink -Path $sNewFolder -Name $oFile.Name -Value $oFile.FullName | Out-Null
            }
        }
}

Каталог назначения не должен существовать.

Затем можете начинать раздавать новосозданную структуру каталогов с одиночными случайными файлами.

mwz 02-01-2018 12:41 2788547

Цитата:

Цитата Iska
Таким образом, дополнительного места эти файлы занимать не будут. »

Из объяснений MI-5 я понял так, у него лежит набор скриншотов из фильмов, которые он раздаёт — и ему весь этот набор и нафиг не нужен, а лишь по одному файлу как пример. И тогда после создания каталога с жёсткими ссылками можно удалить весь исходный каталог, в результате чего жесткие ссылки превратятся в исходные независимые одиночные файлы. :)

Iska 02-01-2018 13:21 2788553

mwz, всяко может быть. Про torrent удалось вытянуть токмо к седьмому сообщению. Попробуй разберись тут :). Не хочется гадать.

Цитата:

Цитата mwz
И тогда после создания каталога с жёсткими ссылками можно удалить весь исходный каталог, в результате чего жесткие ссылки превратятся в исходные независимые одиночные файлы. »

Ну, вот, спалили :lol:.

MI-5 02-01-2018 13:51 2788556

Спасибо за PowerShell. Приду домой - попробую. Исходные файлы не нужны. Примеры нужны только чтобы залить на тот же fastpic.ru. В крайнем случае, забекаплю исходные каталоги. Просто честно не понимаю - какое значение имеет написание тут цели всех этих операций!

Iska 02-01-2018 14:40 2788562

Цитата:

Цитата MI-5
Просто честно не понимаю - какое значение имеет написание тут цели всех этих операций! »

Зачастую — существенное и определяющее, коллега.

MI-5 02-01-2018 16:44 2788575

Iska, простите - не понял. Запускаю в PowerShell, создаётся структура папок и всё. А где сами файлы?

Казбек 02-01-2018 20:49 2788625

Цитата:

Цитата MI-5
Требуется рукурсивно оставить в подпапках один рандомный файл (все файды - jpg) а остальные удалить»

Если вам не принципиально решать вашу задачу скриптами, то могу порекомендовать воспользоваться сторонней утилитой - Bulk Rename Utility. Она маленькая и может быть скачана в портативном виде.

Выполнять инструкцию нужно пошагово и точно: основные пункты настроек выделены желтым цветом, секции, возле которых стоит номер, должны соответствовать скринам.
Этап номер 1

Перед тем, как нажать кнопочку переименовать, не забудьте: Action - Select All
Этап номер 2

Перед тем, как нажать кнопочку переименовать (на этом этапе переместить в нужную вам папку, пункт 2 на скрине), не забудьте: Action - Select All

Все. В исходном каталоге осталось то, что вам нужно. Перемещенное можете удалить в два клика.

MI-5 02-01-2018 23:59 2788659

Казбек, Чёрт ногу сломит с рандомным выбором. В предложенном Вами варианте получаем в итоге первый файл в папке с именем 9. Пока через раз получается (Action-Random Sort), но это как-раз то, что нужно. Думаю, на десятитысячной папке привыкну)) Спасибо.

Iska 03-01-2018 01:41 2788677

Цитата:

Цитата MI-5
Запускаю в PowerShell, создаётся структура папок и всё. »

Покажите, как это выглядит.

Цитата:

Цитата MI-5
А где сами файлы? »

Должны быть внутри.

MI-5 03-01-2018 08:03 2788689

Iska, Просто названия исходных папок. Папки пустые. К примеру, были папки 1,2,3. В результате выполнения скрипта в результирующей папке создаются те же самые пустые папки 1,2,3, но пустые. Удаляю исходные - просто удаляются. Уж и Windows Management Framework, и PowerShell обновлял - безрезультатно. Ну да ладно. Делаю по инструкции Казбека. Спасибо за помощь.

Там у Казбека я делаю даже проще: просто переименовываю не сквозной нумерацией, потом в Total Commander'e Ctrl+B и удаляю все не девятки. В итоге остаётся по одному искомому файлу в папке. Задача решена.

Iska 03-01-2018 08:18 2788690

MI-5, я просил:
Цитата:

Цитата Iska
Покажите, как это выглядит. »

не «расскажите», а «покажите». Как выглядит Ваш код. Как выглядит его запуск. Что при этом происходит в среде исполнения — окне консоли PowerShell или окне PowerShell ISE.

MI-5 03-01-2018 09:26 2788695

Iska, Код копипастил у Вас с первой страницы. Скрипт выполняется без ошибок, но папки пустые. Всё, опытным путём удалось установить, что проблема в квадратных скобках в имени подпапок. Если заменить на круглые или совсем удалить - скрипт работает правильно. Ещё раз спасибо.

Iska 03-01-2018 12:03 2788701

MI-5, оттого-то я и просил Ваш код и процесс исполнения, дабы увидеть Ваши пути.


Время: 19:06.

Время: 19:06.
© OSzone.net 2001-