[identity profile] pilot-kosyakoff.livejournal.com posting in [community profile] useful_faq
есть список файлов которые необходимо найти на компьютере, их около 10 000 
Есть ли какая нибудь программка которой можно было бы скормить этот список, а она в ответ бы выдала файлики которые нашлись?

Спасибо.

Date: 2010-11-12 09:36 am (UTC)
From: [identity profile] ikaktys.livejournal.com
можно написать .bat который будет читать построчно текстовый файл, искать и результат писать в другой:

for /f %%i in (c:\input.txt) do (
echo %%i
find /i "%%i" >>result.txt
)

Date: 2010-11-12 09:47 am (UTC)
From: [identity profile] ikaktys.livejournal.com
естессно, добавь копирование

Date: 2010-11-12 01:34 pm (UTC)
From: [identity profile] aterentiev.livejournal.com
я что-то не понял, все файлы, что-ли, известно где лежат? тогда же все проще
надо бы задачу ставить поточнее

Date: 2010-11-12 01:47 pm (UTC)
From: [identity profile] aterentiev.livejournal.com
ну это тоже, конечно, выход
а мой подход внизу не понравился? если все файлы в одной папке, то можно и проще:

for /f "delims=" %%i in (input.txt) do copy "c:\from_dir\%%i" "c:\target_dir_to_copy"

в конце можно добавить >nul 2>nul

Date: 2010-11-12 01:49 pm (UTC)
From: [identity profile] aterentiev.livejournal.com
имена должны быть с расширением, иначе можно так:

for /f "delims=" %%i in (input.txt) do copy "c:\from_dir\%%i.jpg" "c:\target_dir_to_copy"

и целевая папка должна существовать

Date: 2010-11-12 01:58 pm (UTC)
From: [identity profile] aterentiev.livejournal.com
решение, что ниже, ищет по всему компу :)

Date: 2010-11-12 02:08 pm (UTC)
From: [identity profile] aterentiev.livejournal.com
ну тогда было бы неплохо переписать понравившееся решение наверх в пост, чтобы людям, у которых та же проблема, по комментам не шариться
естественно, со всеми шагами (копирование, поиск)

Date: 2010-11-12 01:00 pm (UTC)
From: [identity profile] aterentiev.livejournal.com
а что делать, если файл с таким именем несколько раз встречается?

Date: 2010-11-12 12:52 pm (UTC)
From: [identity profile] aterentiev.livejournal.com
перемудрил ты немного, точнее недомудрил
find /i не найдет файл, нужно бы сперва до цикла dir /b /s > files.txt сделать, а потом уже в нем с помощью find искать

Date: 2010-11-12 11:52 am (UTC)
From: [identity profile] karpion.livejournal.com
Очень рекомендую изучить Unix (Linux, FreeBSD). Там есть утилиты find, grep, sort и много других, из которых можно построить любую конструкцию.

Есть также язык Perl - тоже очень хорошее решение. Или VisualBasic - хуже, но тоже можно использовать.

PS: И Unix-утилиты, и Perl есть под Windows. А VisualBasic там родной.

Date: 2010-11-12 12:59 pm (UTC)
From: [identity profile] aterentiev.livejournal.com
все, что возможно в никсах - возможно и в командной строке винды, вопрос прикрученности рук и фантазии :)

Date: 2010-11-12 01:36 pm (UTC)
From: [identity profile] karpion.livejournal.com
Проблема в том, что прикрутить это в Винду - та ещё задача. А в Юниксе это уже готово.

Date: 2010-11-12 01:38 pm (UTC)
From: [identity profile] aterentiev.livejournal.com
да не нужно ничего прикручивать, там все уже есть :)

Date: 2010-11-12 01:56 pm (UTC)
From: [identity profile] karpion.livejournal.com
Хорошо, расскажите мне, как удалить все файлы типа *.tmp

rm `find / -name '*,tmp'`
или
find / -name '*,tmp' -rm # этот вариант надо проверить, всё ли я сделал правильно

Date: 2010-11-12 02:05 pm (UTC)
From: [identity profile] aterentiev.livejournal.com
cd c:\
del /s /q /f *.tmp

/s - рекурсивно
/q - удалять не спрашивая
/f - удалять защищенные от записи

можно в одну строку:
cd c:\ & del /s /q /f *.tmp

Date: 2010-11-13 08:40 pm (UTC)
From: [identity profile] karpion.livejournal.com
Ну, хорошо. А переместить/скопировать эти файлы в указанную папку?

А удалить файлы *.TMP, но не все, а только старше указанной даты?

Date: 2010-11-14 09:19 am (UTC)
From: [identity profile] aterentiev.livejournal.com
если ограничиться только маской, а не списком, как в посте, и предположив, что файлы имеют разные имена, то копирование делается достаточно просто (bat-file, если нужно просто в командной строке, то двойные %% нужно заменить на одинарные):

for /f "delims=" %%i in ('dir /b /s /o:-d *.tmp') do copy "%%i" d:\target_dir

вариант с удалением старых файлов несколько сложнее, т.к. имхо нет встроенного сравнения дат, но тоже не невозможен, мое решение в виде бат-файла:

@echo off
setlocal EnableDelayedExpansion
for /f "delims=" %%i in ('dir /b /s /o:-d *.tmp') do (
   set eudate=%%~ti
   set usdate=!eudate:~6,4!-!eudate:~3,2!-!eudate:~0,2!
   if !usdate! gtr 2008-01-01 del "%%i"
)


из-за того, что на моем компе европейская система записи дат ДД.ММ.ГГГГ, чтобы иметь возможность сравнивать даты я перевел их в американский стандарт ГГГГ-ММ-ДД... не так элегантно, конечно, но скажем так - не смертельно, если знать как

Date: 2010-11-14 04:34 pm (UTC)
From: [identity profile] karpion.livejournal.com
Вот, уже приходится писать программу с циклами, т.е. полноценно программировать. И вообще говоря, конструкции тут весьма неочевидные (хотя возможно, просто сильно непривычные). Собственно, Вы фактически пишете юниксовую find.

Ещё изменю задачу: надо эти файлы запихнуть в архив.

А вот ещё одна интересная задача: есть файлы с именами типа "имя.фамилия", и надо переименовать их в "фамилия_имя".

PS: Только не примите за наезд.

Date: 2010-11-14 05:01 pm (UTC)
From: [identity profile] aterentiev.livejournal.com
да я спокоен, какие тут наезды... :)

дело в то, что конкретно было в исходном вопросе? а была идея, что для решения задачи жизненно необходимы юникс-утилиты и/или их копия-адаптация типа сигвина
я на это сказал, что "все, что возможно в никсах - возможно и в командной строке винды" - пока что я с задачами справляюсь
нужно просто понять всю мощь связки for-find-dir - и можно решать любые задачи
я, например, делал парсер с кросс-поиском по многим csv-файлам с генерацией xml по шаблону, когда не было csv-xslt-парсера

я естественно подтверждаю, что мелкософту в винде все можно было бы сделать проще или по-другому, но нужно уметь использовать и то, что уже есть, по-возможности не тяготея к установке отдельного софта для каждой всплываемой задачи...
командная строка винды тоже не стоит на месте

я вполне могу решить и другие предложенные задачи, там будет все тот же знакомый for, но, пожалуйста, не в качестве экзамена, а только если я этим могу кому-либо помочь :)

Date: 2010-11-14 09:21 am (UTC)
From: [identity profile] aterentiev.livejournal.com
а, да, прошу прощения "старше даты" имеется в виду, конечно же "старые файлы"?
тогда вместо gtr в строке с if нужно написать lss

Date: 2010-11-12 01:25 pm (UTC)
From: [identity profile] aterentiev.livejournal.com
мое бат-решение:

@echo off
dir /b /s > files.txt
for /f "delims=" %%i in (input.txt) do find /i "%%i" files.txt >>result.txt
for /f "delims=" %%i in (result.txt) do copy "%%i" "c:\target_dir_to_copy" /Y > nul 2> nul

строка 1: копируем список всех файлов на компе в файл files.txt, занимает пару минут
строка 2: ищем в нем согласно input.txt и складываем результаты в result.txt, занимает секунд по 10-30 на файл, в зависимости от количества файлов на компе и его скорости
строка 3: копируем файлы в каталог "c:\target_dir_to_copy" игнорируя ошибки и повторяющиеся файлы, время непрогнозируемо

правда, если файлов много и комп забит - то это на полночи

Date: 2010-11-12 01:27 pm (UTC)
From: [identity profile] aterentiev.livejournal.com
ах, да, перед стартом:
1. удалить старый result.txt
2. создать целевую папку (обязательно!)

Date: 2010-11-12 11:35 pm (UTC)
From: [identity profile] digitype.livejournal.com
Если в названиях файлов есть общие корни, то можно применить маску.
Например, в списке файлы:
fileAB-001.doc
fileAB-002.doc
fileAB-003.doc
...

Задаем в поиске fileAB*.doc в любом менеджере файлов, я например пользуюсь Total Commander-ом, и он находит все файлы соответствующие маске.