<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; CMD/BAT: поиск в txt файле повторяшихся строк]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=8069&amp;type=atom" />
	<updated>2013-02-18T06:58:14Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=8069</id>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: поиск в txt файле повторяшихся строк]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=69600#p69600" />
			<content type="html"><![CDATA[<p><strong>UNDYING</strong>, спасибо за корректные замечания. О некоторых знал, но не учел, о большинстве других не додумал.</p>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2013-02-18T06:58:14Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=69600#p69600</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: поиск в txt файле повторяшихся строк]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=69599#p69599" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>Не понимаю Вас. Покажите короткий и понятный пример, раскрывающий эту особенность.</p></blockquote></div><p>Поправил - сам ошибался (в дискуссиях рождается правда).<br /></p><div class="quotebox"><blockquote><p>Это верно, но информация избыточна.</p></blockquote></div><p>Да, согласен. Но представим ситуацию в идеале:<br /></p><div class="codebox"><pre><code>
for /f %%a in (&#039;наш_скрипт.cmd C:\Music\*.mp3&#039;) do (ren &quot;%%a&quot; &quot;%%~dpa%time%%%~xa&quot;)
for /f %%a in (&#039;dir /b/s/a-d/on *.mp3&#039;) do (copy &quot;%%a&quot; &quot;%cd%\%%~nxa&quot;)
</code></pre></div><p><strong>a.</strong> ищем дубликаты (для mp3, напимер) и при наличии оных, переименовываем (например, в соотвествии с датой создания или содержимым).<br /><strong>b.</strong> копируем все файлы (mp3) (например, на флешку)<br />на пункте <strong>a</strong> &quot;спотыкаемся&quot; из-за избыточного вывода.</p><br /><div class="quotebox"><blockquote><p>Ужасное решение получилось, многословное - пришлось использовать несколько ухищрений из-за отсутствия некоторых возможностей.</p></blockquote></div><p>Очень круто, только косметические изменения, <em>и оно некорректно обрабатывает файлы с &quot;!&quot; в имени:</em><br /></p><div class="quotebox"><blockquote><p>...<br />&lt; &quot;%allfiles%&quot; call &quot;%~f0&quot; : basename | sort | call &quot;%~f0&quot; : uniq | findstr /l /e <strong><span style="color: red">/i</span></strong> /g:/ &quot;%allfiles%&quot;<br />...<br />:: Ведется поиск файлов, заданных шаблоном<br />:: во всех подкаталогах текущего каталога<br />dir /b/s<strong><span style="color: red">/a-d</span></strong> &quot;%pattern%&quot; &gt;&quot;%allfiles%&quot;<br /><span style="color: blue"><em>:: ^^ иначе ищем и директории</em></span></p><p>...</p><p>:: Подпрограмма выбирает только имя файла (с расширением)<br />:: Аналог unix-команд: xargs -IX basename &quot;X&quot;<br />:basename<br />for /f &quot;usebackq tokens=*&quot; %%a in ( `<br />&nbsp; &nbsp; find /v &quot;&quot;<br />` ) do @(<br />&nbsp; &nbsp; echo.<span style="color: red"><strong>\</strong></span>%%~nxa<br />)<br /><span style="color: blue"><em>:: ^^ иначе 123.txt и 1123.txt расцениваются как равнозначные.<br />:: Но в любом (!) случае &quot;съедаются&quot; восклицательные знаки в именах.</em></span></p><p>...</p><p>:: Подпрограмма ищет дубликаты и отображает их<br />:: Аналог unix-команды: uniq -d<br />:uniq<br />setlocal enabledelayedexpansion</p><p>set A=<br />set /a N=0</p><p>for /f &quot;usebackq tokens=*&quot; %%a in ( `<br />&nbsp; &nbsp; find /v &quot;&quot;<br />` ) do @(<br />&nbsp; &nbsp; if <span style="color: red"><strong>/I</strong></span> &quot;%%~a&quot; == &quot;!A!&quot; (<br />&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: blue"><em>rem ^^ независимо от регистра</em></span><br />&nbsp; &nbsp; &nbsp; &nbsp; set /a N+=1<br />&nbsp; &nbsp; &nbsp; &nbsp; if !N! equ 2 (<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo.%%~a<br />&nbsp; &nbsp; &nbsp; &nbsp; )<br />&nbsp; &nbsp; ) else (<br />&nbsp; &nbsp; &nbsp; &nbsp; set &quot;A=%%~a&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; set /a N=1<br />&nbsp; &nbsp; )<br />)<br />...</p></blockquote></div><p><strong>uniq</strong> требует ещё доработки - бывает, &quot;спотыкается&quot; (ищу закономерности) на строках вида:<br /></p><div class="codebox"><pre><code>X:\REPORT.HTML\BACKUP\2011_03_03_13_35_21_250.HTM</code></pre></div><p>Работает очень быстро, хороший код.</p><p>Если в ущерб скорости(работает очень медленно), но без создания файлов, то:<br /></p><div class="codebox"><pre><code>@echo off
setlocal enabledelayedexpansion
if &quot;%*&quot; == &quot;&quot; (set mask=&quot;*.*&quot;) else (set mask=&quot;%~1&quot;)
(for /f &quot;usebackq tokens=*&quot; %%a in (`
    dir /a-d /b /s %mask%
`) do (
       (dir /a-d /b /s %mask% | find /i /v &quot;%%~a&quot;) | (
       (findstr /l /e /c:&quot;\\%%~nxa&quot; 2&gt;&amp;1 1&gt;nul
       ) &amp;&amp;echo.%%~a)))
exit /b 0 &amp; endlocal</code></pre></div><p>Недостаток тот же.</p><p>Через создание кучи временных файлов:<br /></p><div class="codebox"><pre><code>@echo off
if &quot;%*&quot; == &quot;&quot; (set mask=&quot;*.*&quot;) else (set mask=&quot;%~1&quot;)
set wpath=%temp%\%random%_%random%
md %wpath%\dup
for /f &quot;tokens=* delims=:&quot; %%a in (&#039;dir /b/s/a-d %mask%&#039;) do (
    if exist &quot;%wpath%\%%~nxa&quot; (if not exist &quot;%wpath%\dup\%%~nxa&quot; (
        fsutil hardlink create &quot;%wpath%\dup\%%~nxa&quot; &quot;%wpath%\%%~nxa&quot; 2&gt;&amp;1 &gt;nul
    ))
    echo %%a&gt;&gt;&quot;%wpath%\%%~nxa&quot;
)
2&gt;nul type %wpath%\dup\*
2&gt;&amp;1 &gt;nul rd /s/q %wpath%
exit /b 0
</code></pre></div><p>Работает шустро и &quot;поддерживает&quot; &quot;!&quot; в именах файлов.<br />По идее, &quot;спотыкнётся&quot; на символах &quot;%&quot;,&quot;&amp;&quot; в именах, <em>надо проверить</em>, и для работы требует прав администратора.</p>]]></content>
			<author>
				<name><![CDATA[UNDYING]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27822</uri>
			</author>
			<updated>2013-02-18T06:23:46Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=69599#p69599</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: поиск в txt файле повторяшихся строк]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=69595#p69595" />
			<content type="html"><![CDATA[<p>Ужасное решение получилось, многословное - пришлось использовать несколько ухищрений из-за отсутствия некоторых возможностей. </p><div class="codebox"><pre><code>
@echo off

if &quot;%~1&quot; == &quot;:&quot; goto :%~2

if &quot;%~1&quot; == &quot;&quot; (
    echo.Usage: %~n0 pattern
    goto :EOF
)

setlocal

:: шаблон поиска
set &quot;pattern=%~1&quot;

:: Все найденные файлы (полные пути) сохраняются в файл %allfiles%
set &quot;allfiles=%TEMP%\allfiles.txt&quot;

:: Ведется поиск файлов, заданных шаблоном
:: во всех подкаталогах текущего каталога
dir /b /s &quot;%pattern%&quot; &gt;&quot;%allfiles%&quot;

:: Взять список найденных файлов
:: Получить список имен файлов
:: Отсортировать
:: Найти только дубликаты
:: Применить полученный список к списку всех файлов
&lt; &quot;%allfiles%&quot; call &quot;%~f0&quot; : basename | sort | call &quot;%~f0&quot; : uniq | findstr /l /e /g:/ &quot;%allfiles%&quot;

endlocal
goto :EOF


:: Подпрограмма выбирает только имя файла (с расширением)
:: Аналог unix-команд: xargs -IX basename &quot;X&quot;
:basename
for /f &quot;usebackq tokens=*&quot; %%a in ( `
    find /v &quot;&quot;
` ) do @(
    echo.%%~nxa
)
goto :EOF


:: Подпрограмма ищет дубликаты и отображает их
:: Аналог unix-команды: uniq -d
:uniq
setlocal enabledelayedexpansion

set A=
set /a N=0

for /f &quot;usebackq tokens=*&quot; %%a in ( `
    find /v &quot;&quot;
` ) do @(
    if &quot;%%~a&quot; == &quot;!A!&quot; (
        set /a N+=1
        if !N! equ 2 (
            echo.%%~a
        )
    ) else (
        set &quot;A=%%~a&quot;
        set /a N=1
    )
)

endlocal
goto :EOF

</code></pre></div><p>Аналогичный код в Unix без использования временного файла:<br /></p><div class="codebox"><pre><code>
pattern=&#039;*.mp3&#039;
find . -name &quot;$pattern&quot; | grep -f &lt;(find . -name &quot;$pattern&quot; | xargs -IX basename &quot;X&quot; | sort | uniq -d)
</code></pre></div><p>Можно было бы поиграться с переназначением файловых дескрипторов, чтобы избавиться от двойного вызова команды find и вывод одной команды find направить по двум потокам - один для получения списка имен-дубликатов, второй - вход команды grep.</p>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2013-02-17T21:56:51Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=69595#p69595</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: поиск в txt файле повторяшихся строк]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=69594#p69594" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>С нуля или с единицы - суть не в том, а что в примере есть один &quot;баг&quot; - more smile, точнее особенность его работы. Не в алгоритме, не в идее, а в конкретной реализации.</p></blockquote></div><p>Не понимаю Вас. Покажите короткий и понятный пример, раскрывающий эту особенность. </p><p>Ошибка в моем алгоритме есть. Вернее несовершенство его. Для каждого следующего имени находит дубликаты. Это лишнее. Вот например для списка <br />10\readme.txt<br />11\readme.txt<br />12\readme.txt</p><p>на просто вывести этот список. Мой алгоритм пишет<br />11\readme.txt<br />12\readme.txt<br />10\readme.txt</p><p>12\readme.txt<br />11\readme.txt</p><p>Это верно, но информация избыточна.</p>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2013-02-17T19:23:19Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=69594#p69594</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: поиск в txt файле повторяшихся строк]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=69592#p69592" />
			<content type="html"><![CDATA[<p><strong>Rumata</strong>, благодарю за примеры, но суть не в том:<br />Если создать тестовый набор циклом<br /></p><div class="codebox"><pre><code>for /l %%a in (10,1,99) do (md %cd%\%%a
echo.&gt;%cd%\%%a\readme.txt)</code></pre></div><p>то вывод скрипта из <a href="http://forum.script-coding.com/viewtopic.php?pid=69573#p69573">сообщения</a><br /></p><div class="codebox"><pre><code>
...
B:\94\readme.txt
B:\95\readme.txt
B:\96\readme.txt
B:\97\readme.txt
B:\98\readme.txt
B:\99\readme.txt
B:\93\readme.txt

B:\95\readme.txt
B:\96\readme.txt
B:\97\readme.txt
B:\98\readme.txt
B:\99\readme.txt
B:\94\readme.txt

B:\96\readme.txt
B:\97\readme.txt
B:\98\readme.txt
B:\99\readme.txt
B:\95\readme.txt

B:\97\readme.txt
B:\98\readme.txt
B:\99\readme.txt
B:\96\readme.txt

B:\98\readme.txt
B:\99\readme.txt
B:\97\readme.txt

B:\99\readme.txt
B:\98\readme.txt
</code></pre></div><p>а из <a href="http://forum.script-coding.com/viewtopic.php?pid=69583#p69583">сообщения</a> <br /></p><div class="codebox"><pre><code>
...
&quot;B:\75\readme.txt&quot; 
&quot;B:\76\readme.txt&quot; 
&quot;B:\77\readme.txt&quot; 
&quot;B:\78\readme.txt&quot; 
&quot;B:\79\readme.txt&quot; 
&quot;B:\80\readme.txt&quot; 
&quot;B:\81\readme.txt&quot; 
&quot;B:\82\readme.txt&quot; 
&quot;B:\83\readme.txt&quot; 
&quot;B:\84\readme.txt&quot; 
&quot;B:\85\readme.txt&quot; 
&quot;B:\86\readme.txt&quot; 
&quot;B:\87\readme.txt&quot; 
&quot;B:\88\readme.txt&quot; 
&quot;B:\89\readme.txt&quot; 
&quot;B:\90\readme.txt&quot; 
&quot;B:\91\readme.txt&quot; 
&quot;B:\92\readme.txt&quot; 
&quot;B:\93\readme.txt&quot; 
&quot;B:\94\readme.txt&quot; 
&quot;B:\95\readme.txt&quot; 
&quot;B:\96\readme.txt&quot; 
&quot;B:\97\readme.txt&quot; 
&quot;B:\98\readme.txt&quot; 
&quot;B:\99\readme.txt&quot; 
</code></pre></div><p>С нуля или с единицы - суть не в том, а что в <a href="http://forum.script-coding.com/viewtopic.php?pid=69573#p69573">примере</a> результат нужно прогонять через конструкцию вида:<br /></p><div class="codebox"><pre><code>cat dupfiles.txt | sort | uniq</code></pre></div><p>Пока пробовал, нашёл ошибку у себя, исправленный вариант:<br /></p><div class="codebox"><pre><code>@echo off
set searchmask=*.*
set searchpath=%cd%
set psfx=%searchpath:~-1%
if %psfx% == \ (set searchpath=%searchpath:~0,-1%)
set psfx=
set workpath=%temp%\%random%_%random%
md %workpath%\dup
for /f &quot;tokens=* delims=:&quot; %%a in (&#039;dir /b /s /on /a %searchpath%\%searchmask%&#039;) do (
if exist %workpath%\%%~nxa (fsutil hardlink create %workpath%\dup\%%~nxa %workpath%\%%~nxa 2&gt;&amp;1 &gt;nul)
echo &quot;%%a&quot; &gt;&gt; %workpath%\%%~nxa)
2&gt;nul type %workpath%\dup\*
rd /s/q %workpath%
exit /b 0
</code></pre></div><div class="quotebox"><blockquote><p>Или, ежели есть простой вариант реализации head, можно оставить с more.</p></blockquote></div><p>Посмотрел пристально, <strong>head</strong> не поможет никаким боком.</p>]]></content>
			<author>
				<name><![CDATA[UNDYING]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27822</uri>
			</author>
			<updated>2013-02-17T18:37:38Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=69592#p69592</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: поиск в txt файле повторяшихся строк]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=69585#p69585" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>Вы ведёте счёт с единицы?</p></blockquote></div><p><strong>UNDYING</strong>. Честно говоря затрудняюсь ответить без примеров. Уж простите за большую порцию оффтопа. Я считаю, что программисты, авторы программ для работы с текстом были мудры, и создали свои программы так, чтобы они правильно считали <span class="bbu">нумерацию строк текстового файла, начинающуюся с единицы</span>. </p><p>Примеры вывода пронумерованных строк исходного файла (unix, cygwin)<br /></p><div class="codebox"><pre><code>
seq 11 15 | awk &#039;{ print NR, $0; }&#039;
seq 11 15 | perl -ple &#039;$_ = &quot;$. $_&quot;&#039;
seq 11 15 | sed =
</code></pre></div><p>more (unix) - опция +n утверждает &quot;<em>выводить, начиная со строки номер n</em>&quot; (поэтому +0 и +1 эквиваленты)<br /></p><div class="codebox"><pre><code>
seq 11 15 | more +0
seq 11 15 | more +1
seq 11 15 | more +2
</code></pre></div><p>more (dos) - опция +n утверждает &quot;<em>пропустить n строк</em>&quot; (поэтому +0 выводит с начала файла, +1 пропускает одну строку и печатает, начиная со строки 2. И т.д.)<br /></p><div class="codebox"><pre><code>
( for /l %l in ( 11, 1, 15 ) do @echo %l ) | more +0
( for /l %l in ( 11, 1, 15 ) do @echo %l ) | more +1
( for /l %l in ( 11, 1, 15 ) do @echo %l ) | more +2
</code></pre></div><p>====</p><p>Считаю, что в данном случае рэдмондские волшебники выбрали путь наименьшего сопротивления и <span class="bbu">считают строки с нуля</span>, что в корне неверно - с нуля можно считать внутренние объекты программы (элемент массива, позиция в строке, позиция в файле и т.д.), но отображаемые объекты (в данном случае строки файла) должны нумероваться натуральными числами.</p>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2013-02-17T10:44:37Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=69585#p69585</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: поиск в txt файле повторяшихся строк]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=69583#p69583" />
			<content type="html"><![CDATA[<p><strong>Rumata</strong>, спасибо за оперативность.<br /></p><div class="quotebox"><blockquote><p>Возможно это не правильная локализация, и часть фразы...</p></blockquote></div><p>Вы ведёте счёт с единицы?<br /></p><div class="codebox"><pre><code>more +0 file</code></pre></div><p>Выводит c 1-й строки (с точки зрения &quot;программера&quot; - с нулевой), при +1 со второй и т.д. Интересный баг, чуствуются души суровых бородатых мужчин с красными глазами.<br /><strong>more</strong> - это <strong>pager</strong>, который выбрасывает текст &quot;страницей&quot;, т.е. <em>&quot;со строки N я выброшу страницу текста 80х25&quot;</em>.<br /></p><div class="quotebox"><blockquote><p>Я специально проверил на каталоге, в подкаталогах которого заведомо есть одноименные jpg-файлы. Были выбраны только дубликаты (имен файлов, естественно). Повторов не было. Команда more +n выбрана не случайно</p></blockquote></div><p>Алгоритм, посмотрю ещё разок, может в скрипте недочёт, заодно попробую выяснить в чём причина и проверю на зоопарке XP, 2k3,2k8.<br />Для теста попробуйте прогнать пример, если не затруднит:<br /></p><div class="codebox"><pre><code>for /l %%a in (10,1,99) do (md %cd%\%%a
echo.&gt;%cd%\%%a\readme.txt)</code></pre></div><p>И скрипт, соответственно. Каков будет результат?</p><p>Я немного подумал, каким образом можно сократить кол-во циклов в скрипте, и в муках родил:<br /></p><div class="codebox"><pre><code>@echo off
set searchmask=*.*
set searchpath=%cd%
set workpath=%temp%\%random%_%random%
md %workpath%\dup
for /f &quot;tokens=* delims=:&quot; %%a in (&#039;dir /b /s /on /a %searchpath%\%searchmask%&#039;) do (
if exist %workpath%\%%~nxa (fsutil hardlink create %workpath%\dup\%%~nxa %workpath%\%%~nxa 2&gt;&amp;1 &gt;nul)
echo &quot;%%a&quot; &gt;&gt; %workpath%\%%~nxa)
2&gt;nul type %workpath%\dup\*
rd /s/q %workpath%
exit /b 0
</code></pre></div><p>Один цикл, результат исполнения на том же &quot;тазике&quot; с тем же набором файлов ~2 сек.<br />Недостаток:<br /></p><div class="quotebox"><blockquote><p>Для работы с программой FSUTIL требуются права администратора.</p></blockquote></div><p>/off <strong>PowerShell</strong> в примере выше используется только для <em>измерения времени</em> исполнения <strong>cmd.exe /c %тестовый_скрип%</strong>. И да, он сильно непривычен, в сравнении <strong>tcsh/bash/zsh</strong>.</p>]]></content>
			<author>
				<name><![CDATA[UNDYING]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27822</uri>
			</author>
			<updated>2013-02-17T07:08:48Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=69583#p69583</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: поиск в txt файле повторяшихся строк]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=69580#p69580" />
			<content type="html"><![CDATA[<p>Возможно это не правильная локализация, и часть фразы <br /></p><div class="quotebox"><blockquote><p>... at line n</p></blockquote></div><p>должна была бы читаться<br /></p><div class="quotebox"><blockquote><p>... за строкой n</p></blockquote></div>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2013-02-17T05:51:24Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=69580#p69580</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: поиск в txt файле повторяшихся строк]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=69579#p69579" />
			<content type="html"><![CDATA[<p><strong>UNDYING</strong>, коллега! Я не понял Вашу фразу про &quot;выброс&quot;. Я специально проверил на каталоге, в подкаталогах которого заведомо есть одноименные jpg-файлы. Были выбраны только дубликаты (имен файлов, естественно). Повторов не было. Команда more +n выбрана не случайно. Посмотрите еще раз приведенный мной алгоритм. </p><p>У меня нелокализованная версия Win Vista<br /></p><div class="codebox"><pre><code>+n      Start displaying the first file at line n</code></pre></div><p>Это тоже самое, только на англ. </p><p>Но! При выполнении <strong>more +n</strong> пропускаются именно <strong>n</strong> первых строк. А это в корне противоречит справке по команде - &quot;вывод файла со строки n&quot;. На самом деле &quot;вывод файла со строки n+1&quot;.</p><p>На PS не пробовал, так как нет опыта написания скриптов на этом мудреном языке.</p>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2013-02-17T05:45:23Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=69579#p69579</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: поиск в txt файле повторяшихся строк]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=69578#p69578" />
			<content type="html"><![CDATA[<p><strong>Rumata</strong> изящнее, но не без недостатков. Обратите внимание на &quot;выброс&quot; в <strong>&quot;dupfiles.txt&quot;</strong>, сказывается использование <strong>more</strong>:<br /></p><div class="quotebox"><blockquote><p>+n&nbsp; &nbsp; &nbsp; Начало вывода первого файла со строки с номером n.</p></blockquote></div><p>^^ по хелпу ясно, что <strong>more</strong> покажет <em>строку N и (как минимум!) два десятка следущих</em>, в итоге мы получаем опять борбу с дубликатами, уже в <em>результирующем списке дублей</em>.<br />Как бороться? Навскидку приходит решение через <strong>findstr</strong> (вместо <strong>more</strong>) - в итоге ещё один вложенный цикл и пару <strong>findstr</strong> в придачу. Работать будет, но &quot;аццки&quot; медленно, главные &quot;тормоза&quot; здесь циклы.<br />Или, ежели есть простой вариант реализации <strong>head</strong>, можно оставить с <strong>more</strong>.</p><p>Как бонус - сравнение скорости моего и вашего вариантов(<strong>findup</strong> и <strong>findup_2</strong>, соответственно), тестовая директория, 245 файлов, 5 уровней вложенности, 15 &quot;дублей&quot; (Win 7 pro, core 2 e5300):<br /></p><div class="codebox"><pre><code>PS H:\repository\releng\3rdparty&gt; foreach ($n in &#039;findup.cmd&#039;, &#039;findup_2.cmd&#039; ) {(Measure-Command {cmd.exe /r $n}).TotalMilliseconds}
44798,1988
31492,5062</code></pre></div><p>Хотя из-за &quot;разности&quot; итогового списка - сравнивать не совсем корректно, но лаконизм на лицо, порядка 33-35 %.</p>]]></content>
			<author>
				<name><![CDATA[UNDYING]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27822</uri>
			</author>
			<updated>2013-02-17T05:32:25Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=69578#p69578</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: поиск в txt файле повторяшихся строк]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=69573#p69573" />
			<content type="html"><![CDATA[<p>Коллега <strong>smaharbA</strong> показал образчик лаконизма и простоты решения: <br /></p><div class="codebox"><pre><code>dir /s /-c 1.mp3 | find /i &quot;1.mp3&quot;</code></pre></div><p>Фактически, его пример и <a href="http://forum.script-coding.com/viewtopic.php?pid=69373#p69373">этот алгоритм</a> решают проблему</p><div class="codebox"><pre><code>
@echo off

setlocal enabledelayedexpansion

:: Все найденные файлы сохраняются в файл %allfiles%
set &quot;allfiles=allfiles.txt&quot;

:: Все найденные дубликаты сохраняются в файл %dupfiles%
set &quot;dupfiles=dupfiles.txt&quot;

:: Ведется поиск файлов с расширением mp3
:: во всех подкаталогах текущего каталога
dir /b /s &quot;*.mp3&quot; &gt;&quot;%allfiles%&quot;

set /a count=0

(
for /f &quot;usebackq tokens=*&quot; %%a in ( `
    type &quot;%allfiles%&quot; 
` ) do (
    set /a count+=1
    more +!count! &quot;%allfiles%&quot; | findstr /l /e /c:&quot;\\%%~nxa&quot; &amp;&amp; (
        echo %%~a
        echo.
    )
)
)&gt;&quot;%dupfiles%&quot;
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2013-02-16T23:01:57Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=69573#p69573</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: поиск в txt файле повторяшихся строк]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=69563#p69563" />
			<content type="html"><![CDATA[<p><em>Если откинуть первоначальное требование автора - поиск повторяющихся строк в файле, а сразу подступиться к поиску файлов с одинаковыми именами</em>, то решение &quot;в лоб&quot;:<br /></p><div class="codebox"><pre><code>
@echo off
set SEARCHMASK=*.*
set SEARCHPATH=%CD%
set WORKPATH=%TEMP%\%RANDOM%_%RANDOM%
md %WORKPATH%\dup
md %WORKPATH%\nondup
for /f &quot;tokens=* delims=:&quot; %%A in (&#039;dir /b /s /on /a %SEARCHPATH%\%SEARCHMASK%&#039;) do (
echo &quot;%%A&quot; &gt;&gt; %WORKPATH%\%%~nxA
)
for /f &quot;tokens=* delims=:&quot; %%A in (&#039;dir /b /on /a-d %WORKPATH%&#039;) do (
(type %WORKPATH%\%%A | findstr /N &quot;.&quot; | findstr /b &quot;2:&quot;&gt;nul) &amp;&amp; (move %WORKPATH%\%%A %WORKPATH%\dup\%%A 2&gt;&amp;1 &gt;nul) || (move %WORKPATH%\%%A %WORKPATH%\nondup\%%A 2&gt;&amp;1 &gt;nul)
)
echo &quot;Files with duplicate names:&quot;
for /f &quot;tokens=* delims=:&quot; %%A in (&#039;dir /b /on /a-d %WORKPATH%\dup&#039;) do (
echo %%A
type %WORKPATH%\dup\%%A
)
ping -n 4 127.0.0.1 &gt;nul
rd /s/q %WORKPATH%
</code></pre></div><p>Из недостатков - защиты &quot;от дурака&quot; нет, файлы дожны быть, связка из <strong>type</strong>, двух <strong>findstr</strong> и <strong>move</strong> <span class="bbu">работает крайне (!) медленно</span>. После запуска смело идите пить чай, разговаривать с девушками и заниматься другими не менее полезными и приятными вещами, правда это - уже оффтоп.<br />PS.<br />Писалось и проверялось на Win 7 Pro, <em>на XP и 2k конструкция вида:</em><br /></p><div class="codebox"><pre><code>
(type %WORKPATH%\%%A | findstr /N &quot;.&quot; | findstr /b &quot;2:&quot;&gt;nul) &amp;&amp; (move %WORKPATH%\%%A %WORKPATH%\dup\%%A 2&gt;&amp;1 &gt;nul) || (move %WORKPATH%\%%A %WORKPATH%\nondup\%%A 2&gt;&amp;1 &gt;nul)
</code></pre></div><p><em>может работать <span class="bbu">не так как надо</span>.</em></p>]]></content>
			<author>
				<name><![CDATA[UNDYING]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27822</uri>
			</author>
			<updated>2013-02-16T15:02:10Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=69563#p69563</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: поиск в txt файле повторяшихся строк]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=69549#p69549" />
			<content type="html"><![CDATA[<p>dir /s /-c 1.mp3 | find /i &quot;1.mp3&quot;</p>]]></content>
			<author>
				<name><![CDATA[smaharbA]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2911</uri>
			</author>
			<updated>2013-02-15T20:55:25Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=69549#p69549</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: поиск в txt файле повторяшихся строк]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=69396#p69396" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Rom5 пишет:</cite><blockquote><p>... удобнее использовать не &quot;find&quot;, а &quot;findstr&quot;...</p></blockquote></div><p>Разве автору достаточно сравнить имена файлов? Мне думается, что ему требуется сравнивать именно сами файлы и выводить дубли, если такие имеются. Хотя этот способ не сработает, если есть две одинаковые композиции (ведь сравнение изначально планировалось для mp3 файлов), но с разными тегами, то они распознаются как разные файлы.</p>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2013-02-12T14:53:21Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=69396#p69396</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: поиск в txt файле повторяшихся строк]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=69393#p69393" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Rom5 пишет:</cite><blockquote><p>поискать примеры использования регулярных выражений</p></blockquote></div><p>В .cmd?</p>]]></content>
			<author>
				<name><![CDATA[Serge Yolkin]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27503</uri>
			</author>
			<updated>2013-02-12T13:57:54Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=69393#p69393</id>
		</entry>
</feed>
