Показать полную графическую версию : Поиск дублирующихся названий в двух каталогах
kelevara
26-04-2013, 15:09
Добрый день!
Необходимо каталогах, которые задаются в качестве параметров скрипта, найти и вывести на экран имена повторяющихся файлов. При этом для проверки наличия файла во втором каталоге необходимо использовать только один оператор For и IF.
Ксеноинженер
26-04-2013, 21:12
Считает все файлы, кроме скрытых и системных.
@echo off
set dir1=C:\
set dir2=D:\
CD /d %dir2%
for /f "tokens=*" %%I IN ('dir /b /a-d-h-s "%dir1%"') DO (
IF EXIST "%%I" echo %%I
)
pause
kelevara
26-04-2013, 21:13
Нашел схожий скрипт, но не выходит его изменить под свои нужды:
@echo off
for /f "tokens=*" %%i in ('dir /b /a-d "c:\lab2\1"') do if exist "c:\lab2\2\%%~nxi" echo %%~nxi
pause
1. Необходимо задать каталоги, в которых будет производиться поиск, с помощью параметров. Для этого делаю следующее:
@echo off
set directum1=c:\lab2\1
set directum2=c:\lab2\2
for /f "tokens=*" %%i in ('dir /b /a-d %directum1%') do if exist %directum2%+%%~nxi echo %%~nxi
pause
Но этот номер не проходит. Как быть?
2. Скрипт выводит только те файлы, у которых совпадает и разрешение и имя, а мне разрешение не важно, главное чтобы имя совпадало. Для этого в %%~nxi убираю х. Но это также не помогает...
Ксеноинженер, мм, а как сделать так, чтобы расширение не учитывалось при поиске?
Ксеноинженер
26-04-2013, 21:19
kelevara, дело в скобках после DO.
@echo off
set dir1=C:\
set dir2=D:\
CD /d "%dir2%"
for /f "tokens=*" %%I IN ('dir /b /a-d-h-s "%dir1%"') DO (
IF EXIST "%%~nI" echo %%~nI
)
pause
Вот так сравнивается только имя файла.
kelevara
28-04-2013, 00:15
kelevara, дело в скобках после DO.
Код:
@echo off
set dir1=C:\
set dir2=D:\
CD /d "%dir2%"
for /f "tokens=*" %%I IN ('dir /b /a-d-h-s "%dir1%"') DO (
IF EXIST "%%~nI" echo %%~nI
)
pause
Вот так сравнивается только имя файла. »
Странно, этот вариант у меня вообще ничего не находит. У меня есть две папки 1 и 2. В папке 1 лежат файлы 1.txt, lab2-1.bat, lab2-2.bat, lab2-3.bat, lab2-4.bat, lab2-5.bat.
В папке 2 лежат файлы 1.bat, lab2-1.bat, lab2-3.bat, lab2-5.bat.
Соответственно, в результате работы программы на экран должен выводится следующий список:
1
lab2-1
lab2-3
lab2-5
К слову, предыдущий вариант скрипта, приведенный во втором сообщении, выводит такой список:
lab2-1.bat
lab2-3.bat
lab2-5.bat
Сообщение удалено автором.
Ксеноинженер
28-04-2013, 02:20
Цитата kelevara:
Соответственно, в результате работы программы на экран должен выводится следующий список:
1
lab2-1
lab2-3
lab2-5 »
Так?
@echo off
set directum1=c:\lab2\1
set directum2=c:\lab2\2
CD /d "%directum2%"
for /f "tokens=*" %%I IN ('dir /b /a-d-h-s "%directum1%"') DO (
IF EXIST %%~nI* echo %%~nI
)
pause
Ксеноинженер, я так тоже пробовал:IF EXIST %%~nI* echo %%~nI »
Точнее, так: IF EXIST %%~nI.* echo %%~nI
Не подходит. Если, например, в %directum2% находится файл lab-2-1.###.bat вместо файла lab2-1.bat, то также будет выведено имя "lab2-1", а оно не должно выводиться, так как файла с таким именем нет.
kelevara
28-04-2013, 18:49
Ксеноинженер, Georgio
Попробую показать вариант, предложенный уважаемым Ксеноинженером. Но проблему, указанную Georgio (тоже кстати не менее уважаемым), также признаю и беру к сведению =)
Ксеноинженер
29-04-2013, 17:00
Не подходит. Если, например, в %directum2% находится файл lab-2-1.###.bat вместо файла lab2-1.bat, то также будет выведено имя "lab2-1", а оно не должно выводиться, так как файла с таким именем нет. »
Georgio, Дисциплина задания kelevara не позволяет второго FOR. Если б позволяла, то было б так:
@echo off
set directum1=c:\lab2\1
for /f "tokens=*" %%I IN ('dir /b /a-d-h-s "%directum1%"') DO (
echo %%~nI>>"%tmp%\list1.txt"
)
set directum2=c:\lab2\2
for /f "tokens=*" %%I IN ('dir /b /a-d-h-s "%directum2%"') DO (
echo %%~nI>>"%tmp%\list2.txt"
)
findstr /i /x /G:"%tmp%\list1.txt" "%tmp%\list2.txt"
del /q "%tmp%\list1.txt"
del /q "%tmp%\list2.txt"
pause
Дисциплина задания kelevara не позволяет второго FOR »
Ксеноинженер, да, это точно. Именно поэтому я удалил своё сообщение:
Сообщение удалено автором. »
Причина: Несоответствие условиям задачи »
@ECHO OFF
SET directum1=c:\lab2\1
SET directum2=c:\lab2\2
CALL :# %directum1% dir1.txt
CALL :# %directum2% dir2.txt
FINDSTR /I /X /G:dir1.txt dir2.txt
PAUSE
DEL dir1.txt dir2.txt
EXIT
:#
FOR /f "tokens=*" %%I in ('DIR /B /A-D %1') DO ECHO %%~nI>>%2
EXIT /B
Как бы еще обойтись без временных файлов?
Ксеноинженер
07-05-2013, 23:03
Georgio,
@ECHO off
setlocal enabledelayedexpansion
SET directum1=c:\lab2\1
SET directum2=c:\lab2\2
CD "%directum2%"
FOR /f %%I IN ('DIR /b /a-d "%directum1%"') DO set dir1=!dir1! %%i
FOR /f %%J IN ('DIR /b /a-d "%directum2%"') DO (
set dir1=!!dir1: %%J=""!!
IF NOT ERRORLEVEL 1 ECHO %%~nJ
)
PAUSE
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.