Компьютерный форум 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=324703)

Fafus 12-03-2017 10:26 2718694

Удаление файлов в каталоге и подкаталогах с маской-исключением
 
Господа, прошу помощи, есть каталог с подкаталогами, в которых файлы jpg с именами *.jpg и *_1.jpg. Нужен скрипт, который удалит только файлы с названием типа *.jpg . И перед удалением вывел предупреждение, в каком каталоге и сколько файлов удалится y\n, если это возможно

Iska 12-03-2017 10:42 2718698

Fafus, вот это:
Цитата:

Цитата Fafus
с именами *.jpg и *_1.jpg. »

к чему было? Вы понимаете, что первая маска покрывает вторую целиком и полностью?

Цитата:

Цитата Fafus
И перед удалением вывел предупреждение, в каком каталоге и сколько файлов удалится y\n, если это возможно »

Возможно, но нудно. И зачем?

Код:

del /f /p /s /a "Путь к каталогу\*.jpg"

glukin 12-03-2017 13:30 2718736

Iska, Я так понимаю - нужно:
Если (filename(последние 4 символа в имени файла)==.jpg)&&(filename(последние 6 символов в имени файла)!=_1.jpg) То
Файл удалить

Автор, уточните, если не так.

Fafus 12-03-2017 15:44 2718756

Да, извините, ошибся в первом посте. В общем есть файлы [filename]_1.jpg и [filename].jpg
Нужно оставить только [filename]_1.jpg, остальные удалить.
Конкретный пример: IMG_0018.jpg - удалить, IMG_0018_1.jpg - оставить

По поводу сообщения перед удалением, можно ли сделать хотя бы так, чтобы перед удалением был запрос y/n или что-то вроде этого. Скрипт будет кнопкой в totalcmd, и таким образом хочу обезопаситься от случайного сноса нужных jpg'ов если находясь в другой папке (которую чистить не планирую) запущу скрипт.

megaloman 12-03-2017 15:59 2718758

Если удалить все файлы *.jpg кроме *_1.jpg
Код:

@Echo Off
cls

Set "BoxIn=Z:\Temp"
Set "Mask=.jpg"
Set "MaskEx=_1.jpg"

Set "Exclude=~EXCLUDE.tmp"

Echo %MaskEx%>"%EXCLUDE%"

FOR /F "usebackq delims=" %%f IN (`XCOPY "%BoxIn%\*%Mask%" /L /S /EXCLUDE:%Exclude% 2^>nul`) DO (
        If /I "%%~xf"=="%Mask%" Del /P "%%f"
)
Del "%EXCLUDE%"

pause
GoTo :Eof

Если удалить все файлы filename.jpg, а filename_1.jpg оставить
Код:

@Echo Off
cls

Set "BoxIn=Z:\Temp"
Set "Mask=.jpg"
Set "MaskEx=_1.jpg"

Set "Exclude=~EXCLUDE.tmp"

Echo %MaskEx%>"%EXCLUDE%"

FOR /F "usebackq delims=" %%f IN (`XCOPY "%BoxIn%\*%Mask%" /L /S /EXCLUDE:%Exclude% 2^>nul`) DO (
        If /I "%%~xf"=="%Mask%" If Exist "%%~dpnf%MaskEx%" Del /P "%%f"
)
Del "%EXCLUDE%"

pause
GoTo :Eof


На каждое удаление выдаётся запрос. Имя папки с файлами надо указать, у меня это Set "BoxIn=Z:\Temp"

megaloman 12-03-2017 17:10 2718770

Вот вариант: генерируется батник, в котором собраны команды Del для удаления необходимых файлов. Далее можно этот файл просмотреть, если надо, корректировать и запустить на выполнение, чтобы необходимые файлы были удалены.
Код:

@Echo Off
cls

Set "BoxIn=Z:\Temp"
Set "Mask=.jpg"
Set "MaskEx=_1.jpg"

Set "Exclude=~EXCLUDE.tmp"
Set "ExcludeBat=%~dp0%~n0.~EXCLUDE%~x0"

Echo %MaskEx%>"%EXCLUDE%"
>"%ExcludeBat%" Echo @Echo Off

>>"%ExcludeBat%" (FOR /F "usebackq delims=" %%f IN (`XCOPY "%BoxIn%\*%Mask%" /L /S /EXCLUDE:%Exclude% 2^>nul`) DO (
                        Set "DCount=%%f"
                        If /I "%%~xf"=="%Mask%" If Exist "%%~dpnf%MaskEx%" echo Del /P "%%f"
                )
)
Del "%EXCLUDE%"
>>"%ExcludeBat%" echo rem %DCount%
more "%ExcludeBat%"

Echo Создан файл "%ExcludeBat%"

pause
rem Call "%ExcludeBat%"

GoTo :Eof

Вместо more можно прописать редактор, поддерживающий 866 кодировку (при наличии русских букв в полных путях файлов, если их нет - можно применить, например, notepad) и после этого прописать сформированный батник на выполнение

Iska 12-03-2017 19:05 2718822

Цитата:

Цитата Fafus
Скрипт будет кнопкой в totalcmd, и таким образом хочу обезопаситься от случайного сноса нужных jpg'ов если находясь в другой папке (которую чистить не планирую) запущу скрипт. »

Надо приучаться подобные вещи делать банально «ручками». Что в Far Manager, что в Total Commander задаёте маску поиска с исключением:
Код:

*.jpg|*_1.jpg
ищете, результаты выводите на панель, убеждаетесь, что найдено именно то, что нужно, и ничего лишнего, затем выделяете и удаляете.

Это будет на порядок быстрее, нежели на каждый подобный чих лепить отдельный пакетный файл или скрипт.

megaloman 12-03-2017 20:05 2718845

Fafus, Забыл спросить: конкретная пара filename.jpg и filename_1.jpg находятся в одной папке? Мои решения работают в этом предположении. Если в разных папках, то возможная реализация будет работать намного медленнее.

alpap 13-03-2017 02:31 2718898

Цитата:

Цитата Iska
нежели на каждый подобный чих лепить отдельный пакетный файл или скрипт. »

целиком согласен


Fafus
Еще вариант:
Код:

@echo off
set "d=papka"
set "r=jpg"
echo Следующие файлы будут удалены:& echo:
for /f "delims=" %%a in ('2^>nul dir /a-d/b "%d%\*.%r%"^|findstr /rvc:"^[^_][^_]*_[0-9][0-9]*\.%r%$"') do set /a m+=1& echo %%a& set "$_%%a=%%a"
echo Всего файлов будет удалено: %m% штук& echo:& set /p "v=Сделайте выбор (удалять=y,не удалять=n): "& echo:
if %v%==y (echo Удаляем:& for /f "tokens=2 delims==" %%a in ('set $_') do echo del "%d%\%%a")&: Убрать echo перед del, если все устраивает
if %v%==n echo Операция отложена& echo:
pause

Сохранить в кодировке 866!

Fafus 13-03-2017 07:24 2718916

Всем спасибо, скрипты забрал :)

x0r 13-03-2017 17:39 2719062

off
Для "тотала", такое действит. не нужно, от слова сафсем. Гислер старался-тужился и в итоге заплакал...

Iska 13-03-2017 18:07 2719067

Оно, может быть, и нужно — если требуется делать по десять раз на дню. А вот для Far Manager'а, действительно, не нужно: у него есть встроенный макроязык (нынче — на базе Lua).

x0r 13-03-2017 20:07 2719096

да ну чегож. если имена одинаковые и отличие только в _1, то стоит смотреть откуда они появились, и почему(откуда) такие имена. Почему сразу не переименовывать, если это делает другая программа типа пакетного редактора, с начала. типа new-%старое_имя%.jpg или 1_%старое_имя%.jpg . Тогда в тотале это две комбинашки для сортировки по имени, выдлеления и удаления.
Короче, бороцца с причиной надобно :) тогда и Тотал всё сделает, без скриптов.

CTRL+B | CTRL+ F3 | ALT+ + | SHIFT + DEL

Iska 14-03-2017 07:19 2719204

Цитата:

Цитата x0r
Почему сразу не переименовывать, если это делает другая программа типа пакетного редактора, с начала. типа new-%старое_имя%.jpg или 1_%старое_имя%.jpg . Тогда в тотале это две комбинашки для сортировки по имени, выдлеления и удаления.
Короче, бороцца с причиной надобно тогда и Тотал всё сделает, без скриптов. »

x0r, не надо ничего изобретать. Хотите использовать бранч (Ctrl-B) вместо поиска (Alt-F7) — бога ради, но прочее остаётся неизменным, никакие сортировки/выделения по расширению не нужны, всё по тому же принципу: GrayPlus и ровно та же маска *.jpg|*_1.jpg.

И, вот для того, чтобы постоянно не «сразу переименовывать» и не повторять по десять раз кряду одну и ту же последовательность — и используется у Far Manager'а макроязык.

x0r 17-03-2017 16:37 2720433

да, прально, чё. Мне на так часто это нужно, потому ручками. Былоб нужно чаще, искалбы макросы, да.
Согласен.

Iska 17-03-2017 16:58 2720449

x0r, не хотите попробовать вгрызться в макросы Far Manager'а ;)?


Время: 06:55.

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