Войти

Показать полную графическую версию : [решено] Удаление файлов в папке и подпапках, содержащих определенную строку


hron66
04-12-2013, 10:07
Добрый день. Уважаемые форумчане, есть проблема. Задача стоит следующим образом: необходимо в конкретной папке и всех подпапках найти и удалить:
1) Пустые (нулевые) файлы
2) Файлы, в которых первый символ - .(точка).
Проблема решена лишь частично, сделано удаление пустых файлов в папке и всех подпапках. А вот с удалением файлов, в которых первый символ - точка, не могу до конца разобраться с синтаксисом, хотя наброски уже есть.
@Echo Off
SetLocal
cd /D d:\CSVUpload
For /F "Tokens=*" %%A In ('Dir /B /S /AD 2^>nul^|Sort /R') Do (
For /F "Tokens=3*" %%B In ('Dir "%%A" /S /A-D /N /-C 2^>nul^|FindStr /irc:":[0-5][0-9] *0"') Do Del /F /Q "%%A\%%C" 2>nul&&Echo:File %%A\%%C deleted.
For /F "Tokens=3*" %%B In ('set /p ff=<%%A\%%C') Do IF %ff:~,1% ==. Del /F /Q "%%A\%%C" 2>nul&&Echo:File %%A\%%C deleted.
)
Во внутреннем цикле 1-я строка - удаление пустых файлов, 2-я строка - удаление файлов, содержащих первый символ точку. Вот в этой строке проблема.
Хотя отдельно от циклов, задача частично решена. Вот код:
rem @echo off
set /p ff=<file.txt
IF %ff:~,1% ==. (echo YES2) else (echo NO2)
pause
Этот код ищет первый символ в файле. Вот этот код я и пытался приладить к основному файлу с циклами.
Помогите, чем сможете..

Iska
04-12-2013, 11:40
необходимо в конкретной папке и всех подпапках найти и удалить:

2) Файлы, в которых первый символ - .(точка). »
del /q /s ".*"
Не?!

hron66
04-12-2013, 11:43
Я может как то неправильно объяснил. Имелось в ввиду, первый символ точка не в имени файла, а внутри файла. Если мы открываем файл блокнотом например, то внутри первый символ первой строчки - точка.

Iska
04-12-2013, 15:41
hron66, ясно. Файлы текстовые? Кодировка их какая?

hron66
04-12-2013, 15:55
Файлы обычные текстовые. Кодировка тоже стандартная - cp1251.

sov44
04-12-2013, 17:03
hron66, так?
@ECHO OFF
SETLOCAL EnableDelayedExpansion

for /f "delims=" %%a in ('dir /b /s /a-d "c:\1\new\*" ^|find "\."') do echo rd /q "%%~dpa" 2>nul

pause

hron66
04-12-2013, 17:12
sov44, у меня ваш вариант не работает.. И насколько я понял по коду он расчитан на одну папку (без подпапок). И find ищет все точки в файле, а нужно, чтобы искал только первый символ в файле.

sov44
04-12-2013, 17:32
hron66, не увидел уточнение ТЗ
Имелось в ввиду, первый символ точка не в имени файла, а внутри файла. »
попробуйте
@echo off
setlocal EnableDelayedExpansion

set filename=c:\1\new\dfg.txt
for /f "tokens=1* delims=[]" %%a in ('find /v /n "" ^<"%filename%"') do (
set line=%%a_%%b
if "!line:~0,3!"=="1_." echo %%b
)
pause>nul
exit

Iska
04-12-2013, 18:24
Файлы обычные текстовые. Кодировка тоже стандартная - cp1251. »
Ясно. Пробуйте:
@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq delims=" %%i in (
`dir /b /s /a:-d "E:\Песочница\0334\*.*"`
) do (
<"%%~i" set /p sValue=
if defined sValue if "!sValue:~0,1!" equ "." echo del /f /q "%%~i"
)

endlocal
exit /b 0

Для реального удаления уберите echo.

P.S. А что это за файлы?

hron66
05-12-2013, 09:26
Iska, спасибо огромное !!! Ваше решение работает идеально и именно так, как нужно!
P.S. Это файлы по работе, которые приходят с АРМ и загружаются в БД. При этом, непонятно почему, бывают пустые файлы и файлы, содержащие много точек. Они обрабатываются с ошибками, поэтому хотелось сделать батник для удаления таких файлов. Можно бы было решить это все на Дельфи, но не хотелось еще больше грузить сервер задачами. А батник не ест память и работает очень быстро и незаметно.
P.P.S. Решение уже запущено в работу.
P.P.P.S. Еще раз спасибо всем за помощь!

Iska
05-12-2013, 16:42
hron66, спасибо, ясно.

Dahommie18
20-04-2023, 11:07
Здравствуйте!
Необходимо произвести поиск всех типов документов на дисках С и D и удалить те, которые содержат внутри «для служебного пользования»
Заранее большое спасибо!

DJ Mogarych
20-04-2023, 14:20
"Всех типов документов" - это круто, конечно.
Каких именно типов?




© OSzone.net 2001-2012