Мне нужна летучая мышь, чтобы удалить все файлы с ОТНОСИТЕЛЬНЫМ именем, которые НЕ содержатся в текстовом файле
В текстовом файле list.txt у меня есть это:
C:\S-ATLANTICO-1\MEDIA\Innplay-Logo.mp4
C:\S-ATLANTICO-1\MEDIA\logo-FB_sep.png
C:\S-ATLANTICO-1\MEDIA\logo-news_sa.png
и в той же папке есть эти файлы:
Innplay-Logo.mp4
logo-FB_sep.png
logo-news_sa.png
Carlos.jpg
Sapo.png
list.txt
Поэтому мне нужно удалить следующие файлы, потому что они не существуют в list.txt
Carlos.jpg
Sapo.png
но я также ДОЛЖЕН СОХРАНИТЬ СПИСОК.TXT
я пробовал это, но без успеха
@echo off
setlocal
set "folder=C:\S-ATLANTICO-1\MEDIA"
set "excludeFile=C:\S-ATLANTICO-1\MEDIA\list.txt"
for /f "eol=: delims = " %%F in ('dir /b /a-d "%folder%" ^| findstr /vig:"%excludeFile%" ^| findstr /v /i "\list.txt"') do del "%folder%\%%F"
любой может помочь мне с этим.
Спасибо
Проблема: вы сравниваете вывод dir /b
(file.txt
) с содержимым файла исключения C:\path\file.txt
, поэтому вы не получите правильных совпадений. Самый простой способ обойти это: for /f "eol=: delims = " %%F in ('dir /s /b /a-d "%folder%" ^| findstr /vlig:"%excludeFile%" ^| findstr /vli "%excludefile%"') do @echo del "%%F"
, но имейте в виду, что dir
switch /s` дает полный путь/имена файлов, но также и файлы из подпапок. (может быть или не быть проблемой в вашем случае)
Спасибо @Stephan, это работает нормально, но у меня будут проблемы с подпапками... спасибо
У вас, вероятно, не будет проблем, но это значительно замедляет работу.
Попробуйте. Это работает для моего тестирования.
Я поместил операторы эхо вместо чего-либо удаление.
@echo off
setlocal
set "folder=C:\S-ATLANTICO-1\MEDIA"
set "excludeFile=%folder%\list.txt"
:: Check that both the target folder and filter file exist before starting up.
if not exist "%folder%" echo %~nx0: The target folder doesn't exist. Nothing to do.&& goto :EOF
if not exist "%excludeFile%" echo %~nx0: The list file doesn't exist at the location specified!&& goto :EOF
for /f "delims = " %%F in ('dir /b /a-d "%folder%"') do call :process_file "%%F" "%~0" "%excludeFile%"
goto :EOF
:: --------------------------------------------
:process_file
:: --------------------------------------------
set input_file=%~1
set this_batch=%~2
set list_file=%~nx3
:: Skip list file and this batch file too
if "%this_batch%"= = "%input_file%" echo Skip this batch file&& goto :EOF
if "%list_file%"= = "%input_file%" echo Skip list file&& goto :EOF
:: Grep for the include file in the list
findstr /C:"%input_file%" "%excludeFile%" 2>&1 1>NUL
:: Bail out if the input line was in the list file
if not errorlevel 1 echo Skip "%input_file%", it is in %list_file%&& goto :EOF
:: Delete anything left
echo delete file %input_file%&& goto :EOF
goto :EOF
Да, мы могли бы сделать это с меньшим количеством кода, но это (ИМХО) легче читать и контролировать поведение. Другие не согласятся, я уверен. :^P
Gracias @Señor CMasMas, но я могу получить эту работу... я не вижу никаких действий, я помещаю ваш код в файл CMD и ничего...
Кроме того, у @lit есть хорошее решение, но его нет в пакете. Если вам удобно работать с powershell, вы тоже можете попробовать. :)
Привет... Это работает. Хорошо.. Могу ли я сначала проверить, существуют ли папка и файл .txt?? Если есть гостариа обработать. Спасибо
Con mucho gusto amigo. Я добавил его в код выше. ¡Buena suerte!
Привет @Señor-CMasMas, не могли бы вы помочь мне с этим... мне также нужно исключить файлы с расширением tmp... Спасибо.. Gracias
Попробуйте это. Он перебирает содержимое $thedir
и удаляет файлы, которых нет в list.txt
и которые не являются скриптами. Поместите эти два (2) файла в один и тот же каталог. Лучше не помещать их в тот же каталог, что и удаляемые файлы. Запустите файл .bat из оболочки cmd.exe.
Когда вы убедитесь, что нужные файлы будут удалены, удалите -WhatIf
из командлета Remove-Item
.
=== Удалить-Except.ps1
$thedir = 'C:\src\t\delexcept'
$precious = (Get-Content -Path (Join-Path -Path $thedir -ChildPath 'list.txt')) +
@(Join-Path -Path $thedir -ChildPath 'list.txt')
Get-ChildItem -Path $thedir -Exclude 'list.txt','*.ps1','*.bat' |
Where-Object { (-not $_.PSIsContainer) -and
($precious -notcontains $_.FullName) -and
$_.FullName.StartsWith($thedir) } |
ForEach-Object { Remove-Item -Path $_.FullName -WhatIf }
=== Удалить-Except.bat
powershell -NoLogo -NoProfile -File "%~dpn0.ps1"
В строке cmd это должно делать
for /f "delims = " %A in ('Dir /B /A-D ^|find /v /i "list.txt"') Do @findstr /IL "%~nxA" list.txt >Nul ||(echo del %A)
Я бы включил переключатель /E
с помощью findstr, если последняя строка в list.txt имеет завершающий cr/lf,
иначе последняя запись не будет соответствовать ссылка.
Если вывод выглядит нормально, удалите эхо перед del.
Как пакетный файл:
@Echo off
set "folder=C:\S-ATLANTICO-1\MEDIA"
PushD "%folder%"
set "excludeFile=list.txt"
for /f "delims = " %%A in ('
Dir /B /A-D ^|find /v /i "%excludefile%"'
) Do findstr /IL "%~nxA" "%excludefile%" >Nul ||(
echo del %%A
)
Popd
Почему именно файл .bat?