[identity profile] rainwalker101.livejournal.com posting in [community profile] useful_faq
Есть структура папок типа "название проекта - out - имя_выходного_файла.jpg
И нужно сделать так, чтобы все выходные jpg-файлы оказались не в подпапке out, а в уровнем выше, в папке самого проекта
Как можно это сделать автоматически в семерке?


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


З.Ы. Без написания специального батника в голову пока приходит следующее решение:
- перебрать поиском все подпапки out, заархивировать каждую раром (с сохранением out.rаr-файла на том же уровне, что и сама подпапка out), а потом разархивировать все без сохранения относительных путей.

З.З.Ы. Кстати, раз уж здесь собрались знатоки файловых менеджеров, есть еще один вопрос - может ли какой-либо из них искать файлы по дате? С такого-то по такое-то число? не сортировать уже найденные данные, а с самого начала как-то ограничить поиск временным интервалом, чтобы не перебирать излишнее количество данных?


АПД. Все вопросы разрешены, спасибо.

Date: 2014-05-22 10:03 am (UTC)
From: [identity profile] stormlens.livejournal.com
А Фаром пользоваться разучились? выделить все файлы по маске *.jpg и Ф6 делов на 10 секунд

Date: 2014-05-22 10:06 am (UTC)
From: [identity profile] astracat.livejournal.com
Запускаем поиск по папке проекта (с вложенными папками) всех файлов *.jpg , все найденное копируем куда надо.

Date: 2014-05-22 10:54 am (UTC)
From: [identity profile] aterentiev.livejournal.com
можно уточнить про "автоматически"? это разовая потребность или нужно регулярно такие финты делать?

Date: 2014-05-22 11:08 am (UTC)
From: [identity profile] aterentiev.livejournal.com
снизу написал решение

Date: 2014-05-22 10:07 am (UTC)
From: [identity profile] seraph6.livejournal.com
А много "названий проектов"? Вообще, требуемое делается командой
"move out\*.jpg ."
запущенной в папке "название проекта".
В принципе, можно и перебор дерева с папками проектов реализовать попробовать, т.е. батничек написать...
Edited Date: 2014-05-22 10:10 am (UTC)

Date: 2014-05-22 10:41 am (UTC)
From: [identity profile] seraph6.livejournal.com
Вам нужна команда for - она умеет перебирать каталоги, для каждого из которых поочередно можно применять вышеописанную команду move.
Подробностей уже не помню, шашек в руки не брал давно. Гуглите про for конкретно и про командную строку Windows вообще.
Очевидно, что вам придется как-то ограничивать поиск. Проще всего, поместив все папки "название проекта" в единственную папку и запуская поиск, начиная с нее. Никаких сложностей возникнуть не должно, если структура всех папок одинакова (везде есть каталог out и уровни вложенности тоже одинаковые).

Date: 2014-05-22 11:46 am (UTC)
From: [identity profile] seraph6.livejournal.com
Если у вас искомые *.jpg файлы содержатся только в каталоге out, то должна сработать простейшая конструкция вида:
for /R %A in (*.jpg) do move %A ..

Date: 2014-05-22 10:07 am (UTC)
From: [identity profile] esset-bonum.livejournal.com
Почитайте про командную строку Windows.

заходите в консоли в каталог out, вводите команду move *.jpg .., жмете Enter.

Date: 2014-05-22 10:46 am (UTC)
From: [identity profile] dims12.livejournal.com
У Вас какая операционка-то? ДОС? Во всех современных операционках есть графический интерфейс, позволяющий перетаскивать файлы мышкой. Если мышкой неудобно, то можно через клипборд.

Date: 2014-05-22 10:50 am (UTC)
From: [identity profile] seraph6.livejournal.com
У него 100500 папок вида "название_проекта_1", "название_проекта_2" и т.д.
В каждой - папка out, и далее по тексту. Задача - обработать все 100500 папок верхнего уровня в один заход, а не телепаться с каждой по отдельности.

Date: 2014-05-22 10:52 am (UTC)
From: [identity profile] dims12.livejournal.com
А, дошло.

Тогда надо просто забить на это дело! :)
Edited Date: 2014-05-22 10:53 am (UTC)

Date: 2014-05-22 11:14 am (UTC)
From: [identity profile] dims12.livejournal.com
Я серьёзно. Сам страдаю от того, что трачу излишне много времени, чтобы разложить по полочкам то, что можно и не раскладывать.

Нужно оценить время, сколько Вы потратите на поиск средств и овладевание ими. Кроме того, учтите риск ошибок (лучше сбекапьте всю изначальную конструкцию перед началом экспериментов), когда Ваш скрипт что-то сделает не так и файлы просто перепутаются. И тогда может оказаться, что цель ложная :)

Date: 2014-05-22 11:11 am (UTC)
From: [identity profile] dims12.livejournal.com
Понятно, не сразу дошло. Ну тогда нужно использовать скрипт (батник, например).

В скрипте, как уже сказали, можно использовать команду FOR которая позволяет выполнить другую команду по отношению ко всем файлам или подпапкам.

Другой вариант -- составить список всех папок, которые нужно обработать, а потом этот список переделать в скрипт.

Date: 2014-05-22 11:19 am (UTC)
From: [identity profile] esset-bonum.livejournal.com
Опишите тогда структуру папок проекта. Я так понимаю, есть папка с проектом, в ней - куча подпапок и в каждой из них папка OUT ?

Примерно так?
допустим, у вас проект находится в папке D:\Project.

D:.
├───New folder
│ ├───New folder - Copy (2)
│ │ └───out
│ ├───New folder - Copy (3)
│ │ ├───New folder - Copy (2) - Copy
│ │ │ └───out
│ │ ├───out
│ │ └───out - Copy
│ ├───out
│ └───out - Copy
├───New folder - Copy
│ └───out
├───New folder - Copy - Copy
│ └───out
├───New folder - Copy - Copy (2)
│ └───out
├───New folder - Copy - Copy - Copy
│ └───out
├───New folder - Copy - Copy - Copy (2)
│ └───out
└───New folder - Copy - Copy - Copy - Copy
└───out


Тогда вам поможет более сложная команда с циклом:

for /R D:\Project %i IN (out\*.jpg) DO move "%i" "%~pi.." (со всеми точками и кавычками)

Эта команда пройдется по всем папкам и подпапкам, и если в подпапках, имеющих имя "out", встретит файл *.jpg, то переместит его на уровень выше.

Оно?

Date: 2014-05-22 02:05 pm (UTC)
From: [identity profile] esset-bonum.livejournal.com
в батник как раз необязательно.
Пуск - выполнить - cmd - вставить - enter.

если захотите сохранить батник, то все символы % надо удвоить (%%).

Date: 2014-05-22 03:38 pm (UTC)
From: [identity profile] esset-bonum.livejournal.com
Пожалуйста =)

Date: 2014-05-22 10:18 am (UTC)
From: [identity profile] tantry-juga.livejournal.com
Windows Commander все еще лучшее решение для file management под Виндовс.

Date: 2014-05-22 10:45 am (UTC)
From: [identity profile] dims12.livejournal.com
Непонятно, в чём проблема. Никаких специальных средств не нужно, обычный перенос папок.

Можно просто взять все файлы внутри "out" и перенести на один уровень вверх. А потом стереть "out", которая теперь пустая.

Или переименуйте "название проекта" в "название проекта стереть", потом переименуйте "out" в "название проекта". Потом перенесите "название проекта" на один уровень вверх, а затем сотрите "название проекта стереть", которая теперь пустая.

Date: 2014-05-22 11:07 am (UTC)
From: [identity profile] aterentiev.livejournal.com
for /r %i in (*.jpg) do move %i %~pi\..\


запускать из каталога выше проектов
переносит все *.jpg файлы на этаж выше
PS. сорри, сверху была ошибка, перепроверил, теперь правильно
Edited Date: 2014-05-22 11:12 am (UTC)

Date: 2014-05-22 11:20 am (UTC)
From: [identity profile] stormlens.livejournal.com
Раз уж пошла такая пьянка можно через Shedulle Task назначить это задание на каждую ночь в 0:00 для автоматизации.

Date: 2014-05-22 11:22 am (UTC)
From: [identity profile] aterentiev.livejournal.com
конкретно в этом виде - не надо, оно дальше пойдет переносить :)
вот так можно:

for /r %i in (out\*.jpg) do move %i %~pi\..\


если этот код в батник записывать, то проценты при i нужно удвоить :)
Edited Date: 2014-05-22 11:26 am (UTC)

Date: 2014-05-22 11:39 am (UTC)
From: [identity profile] esset-bonum.livejournal.com
Я это выше уже расписал.
Только переменные надо брать в кавычки на всякий случай - если попадутся папки с пробелами в именах, выдаст ошибку. И, кстати, %~pi уже содержит бэкслеш в конце, так что можно сразу ставить две точки.

Date: 2014-05-22 11:41 am (UTC)
From: [identity profile] aterentiev.livejournal.com
С первым скриптом я был на 10 минут первее :):):)

Date: 2014-05-22 11:42 am (UTC)
From: [identity profile] esset-bonum.livejournal.com
потому что я свой проверял на тестовой папке =)))

Date: 2017-03-30 01:32 am (UTC)
From: [identity profile] butcher admin (from livejournal.com)
Запускаю из портативной (путь заранее неизвестен) папки move.bat, в котором прописано:
for /r %%i in (out\*) do move %%i %%~pi\..\
Нужно чтобы из папки out (которая лежит там же где и батник) все ФАЙЛЫ и ПАПКИ (включая файлы в подпапках), перенесло на уровень выше, т.е. туда, где лежит этот move.bat, сохраняя структуру каталогов (с заменой файлов).

Этот батник делает что-то немного не то, не получается добиться цели. Помогите пожалуйста, второй день не сплю.
Edited Date: 2017-03-30 01:33 am (UTC)

Date: 2017-03-30 01:57 am (UTC)
From: [identity profile] butcher admin (from livejournal.com)
Получилось сделать так:
@echo off

set "source=out"
set "destination=."

for /f "delims=" %%i in ('dir /b/s "%source%"') do (
set var=%%i
for /f "delims=" %%j in ('call echo "%%var:*%source%\=%%"') do (
if exist "%%i" (
if not exist "%destination%\%%~j" (
move /y "%%i" "%destination%\%%~j">nul
)
)
)
)
for /f "delims=" %%i in ('dir /ad/b "%source%"') do (
rd /s/q "%source%\%%i"
)
exit /b


Только папку out не удаляет. Как сделать?
rd /s/q "%source%"
rmdir out /S /Q
Не удаляет саму папку out, только то что внутри.

Date: 2017-03-30 02:07 am (UTC)
From: [identity profile] butcher admin (from livejournal.com)
Разобрался, надо было вынести rd /s/q "%source%" за цикл. То есть после for .. do ( ... )

Date: 2017-03-30 08:05 am (UTC)
From: [identity profile] aterentiev.livejournal.com
Судя по оригинальному посту, проблема решена?

Date: 2014-05-22 01:58 pm (UTC)
From: [identity profile] aterentiev.livejournal.com
да, это особенность обработки символа "процент" в бат-файлах
а код всюду один, у esset_bonum он более правильный

Date: 2014-05-22 11:52 am (UTC)
From: [identity profile] seraph6.livejournal.com
По поводу P.P.S. - полагаю, любой приличный файл-менеджер умеет искать файлы только в рамках заданного временного диапазона. Total Commander точно умеет.