PDA

Показать полную графическую версию : Удаление файлов в каталоге и подкаталогах с маской-исключением


Fafus
12-03-2017, 10:26
Господа, прошу помощи, есть каталог с подкаталогами, в которых файлы jpg с именами *.jpg и *_1.jpg. Нужен скрипт, который удалит только файлы с названием типа *.jpg . И перед удалением вывел предупреждение, в каком каталоге и сколько файлов удалится y\n, если это возможно

Iska
12-03-2017, 10:42
Fafus, вот это:
с именами *.jpg и *_1.jpg. »
к чему было? Вы понимаете, что первая маска покрывает вторую целиком и полностью?

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

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

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

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

Fafus
12-03-2017, 15:44
Да, извините, ошибся в первом посте. В общем есть файлы [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
@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
@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
@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
Скрипт будет кнопкой в totalcmd, и таким образом хочу обезопаситься от случайного сноса нужных jpg'ов если находясь в другой папке (которую чистить не планирую) запущу скрипт. »
Надо приучаться подобные вещи делать банально «ручками». Что в Far Manager, что в Total Commander задаёте маску поиска с исключением:
*.jpg|*_1.jpg
ищете, результаты выводите на панель, убеждаетесь, что найдено именно то, что нужно, и ничего лишнего, затем выделяете и удаляете.

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

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

alpap
13-03-2017, 02:31
нежели на каждый подобный чих лепить отдельный пакетный файл или скрипт. »
целиком согласен

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
Всем спасибо, скрипты забрал :)

x0r
13-03-2017, 17:39
Для "тотала", такое действит. не нужно, от слова сафсем. Гислер старался-тужился и в итоге заплакал...

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

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

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

Iska
14-03-2017, 07:19
Почему сразу не переименовывать, если это делает другая программа типа пакетного редактора, с начала. типа new-%старое_имя%.jpg или 1_%старое_имя%.jpg . Тогда в тотале это две комбинашки для сортировки по имени, выдлеления и удаления.
Короче, бороцца с причиной надобно тогда и Тотал всё сделает, без скриптов. »
x0r, не надо ничего изобретать. Хотите использовать бранч (Ctrl-B) вместо поиска (Alt-F7) — бога ради, но прочее остаётся неизменным, никакие сортировки/выделения по расширению не нужны, всё по тому же принципу: GrayPlus и ровно та же маска *.jpg|*_1.jpg.

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

x0r
17-03-2017, 16:37
да, прально, чё. Мне на так часто это нужно, потому ручками. Былоб нужно чаще, искалбы макросы, да.
Согласен.

Iska
17-03-2017, 16:58
x0r, не хотите попробовать вгрызться в макросы Far Manager'а ;)?




© OSzone.net 2001-2012