Как найти в папке файлы по списку

0 / 0 / 0

Регистрация: 18.04.2015

Сообщений: 13

1

Поиск файлов по списку из файла

27.04.2020, 12:13. Показов 11280. Ответов 9


Студворк — интернет-сервис помощи студентам

Добрый день!

Есть задача:
Имеется папка XML с кучей вложенных подпапок (уровень вложения не менее 3, т.е. XMLподпапкиподпапкифайлы)

Имеется файл список.txt со списком файлов примерного содержания:

Кликните здесь для просмотра всего текста

f1.xml
f2.xml
fail3.xml

Нужно найти все указанные в списке файлы во всех подпапках и скопировать их в новую папку



0



Karen87

2408 / 968 / 444

Регистрация: 29.05.2016

Сообщений: 4,220

27.04.2020, 12:51

2

Пробуйте:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
setlocal enabledelayedexpansion
for /f "tokens=* delims=" %%a in (spisok.txt) do (
    set "string=%%a"
    call :step_1
)
pause
exit
:step_1
for /f "tokens=* delims=" %%a in ('dir /a-d/s/b "XML"') do (
    if %%~nxa==!string! (
        xcopy "%%a" "C:test"
    )
)
exit /b

Добавлено через 8 минут
Соответственно:
spisok.txt – файл со списком файлов
“XML” – папка XML c большим уровнем вложения подкаталогов. Оставляете “XML” только при условии запуска сценария из той же папки, в которой лежит папка XML
“C:test” – каталог, в который будут скопированы найденные файлы. Создавать его предварительно не нужно, в процессе копирования он создаётся автоматически



0



0 / 0 / 0

Регистрация: 19.01.2021

Сообщений: 15

03.02.2021, 13:08

3

Karen87, добрый день.
А если в списке будут фигурировать только имена файлов без расширения, какие изменения нужно внести в Ваш код?



0



Karen87

2408 / 968 / 444

Регистрация: 29.05.2016

Сообщений: 4,220

03.02.2021, 13:17

4

viberezh, добрый. Вот так, наверное:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@echo off
setlocal enabledelayedexpansion
for /f "tokens=* delims=" %%a in (spisok.txt) do (
    set "string=%%a"
    call :step_1
)
pause
exit
:step_1
for /f "tokens=* delims=" %%a in ('dir /a-d/s/b "XML"') do (
    if "%%~na"=="!string!" (
        xcopy "%%a" "C:test"
    )
)
exit /b



0



alpap

4331 / 2121 / 661

Регистрация: 26.04.2015

Сообщений: 6,823

04.02.2021, 14:49

5

Windows Batch file
1
2
3
4
5
6
7
@echo off
set "sF=spisok.txt"
set "sD=C:XML"
set "nD=newDir"
 
for /f "delims=" %%a in ('dir /a-d/b/s "%sD%"^|findstr /g:"%sF%"') do xcopy /iy "%%a" "%nD%"
pause



0



0 / 0 / 0

Регистрация: 19.01.2021

Сообщений: 15

05.02.2021, 10:32

6

alpap, добрый день.
Поиск файлов будет осуществляться по пути \dns320l-817Volume_1, но папка назначения для копирования найденных файлов лежит внутри по пути \dns320l-817Volume_1отобранные фото_тест, возможно её исключить из поиска?

Добавлено через 20 минут
И ещё 1 дополнение.
Имена файлов в следующем формате: 169668_название файла, количество цифр вначале не фиксированное, в списке для поиска будут находится именно начальные цифры из имен, искать нужно по ним.

Добавлено через 5 минут
И можно ли вывести в отдельный текстовый файл позиции из списка, которые не удалось найти?



0



Karen87

2408 / 968 / 444

Регистрация: 29.05.2016

Сообщений: 4,220

05.02.2021, 13:59

7

viberezh, пробуйте:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@echo off
for /f "tokens=* delims=" %%a in (spisok.txt) do (
    call :step_1 "%%a"
)
pause
exit
:step_1
for /f "tokens=* delims=" %%a in ('dir /a-d/s/b "\dns320l-817Volume_1"') do (
    if not "%%~dpa"=="\dns320l-817Volume_1отобранные фото_тест" (
        for /f "tokens=1 delims=_" %%b in ("%%~nxa") do (
        if "%%b"=="%~1" (
            xcopy "%%a" "\dns320l-817Volume_1отобранные фото_тест"
            exit /b
        )
    )
    )
)
powershell -executionpolicy bypass -command "'%~1' | out-file '.not_found.txt' -append"
exit /b

Добавлено через 11 минут
Примечание.
Не забываем сохранить код в кодировке OEM-866 в случае наличия в файлах и путях к ним кириллицы



0



alpap

4331 / 2121 / 661

Регистрация: 26.04.2015

Сообщений: 6,823

05.02.2021, 17:50

8

Цитата
Сообщение от viberezh
Посмотреть сообщение

возможно её исключить из поиска?

Windows Batch file
1
2
3
4
5
6
7
@echo off
set "sF=C:spisok.txt"
set "sD=C:XML"
set "nD=C:XMLотобранные фото_тест"
 
for /f "delims=" %%a in ('dir /a-d/b/s "%sD%"^|find /v "%nD%"^|findstr /g:"%sF%"') do xcopy /iy "%%a" "%nD%"
pause

Цитата
Сообщение от viberezh
Посмотреть сообщение

вывести в отдельный текстовый файл позиции из списка, которые не удалось найти?

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

Windows Batch file
1
2
3
4
5
6
7
8
9
10
@echo off
set "sF=C:spisok.txt"
set "sD=C:XML"
set "nD=C:XMLотобранные фото_тест"
set "log=C:log.txt"
 
for /f "usebackq delims=" %%a in ("%sF%") do (
  for /f "delims=" %%A in ('2^>^&1 dir /a-d/b/s "%sD%%%a*.xml"^|find /v "%nD%"') do echo %%a*.xml - %%A>>"%log%"& >nul xcopy /iy "%%A" "%nD%"
)
pause

Добавлено через 6 минут
если в логе нужны только не найденные маски файлов относительно списка. то строку 8 вывода for записать так:

Windows Batch file
1
... >nul xcopy /iy "%%A" "%nD%"|| echo %%a*.xml - %%A>>"%log%"



0



Karen87

2408 / 968 / 444

Регистрация: 29.05.2016

Сообщений: 4,220

05.02.2021, 18:25

9

Исправленный скрипт:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@echo off
for /f "tokens=* delims=" %%a in (list.txt) do (
    call :step_1 "%%a"
)
powershell -executionpolicy bypass -command "$report=get-content '.not_found.txt' -encoding oem; $report | out-file '.not_found.txt' -Encoding default"
pause
exit
:step_1
for /f "tokens=* delims=" %%a in ('dir /a-d/s/b "\dns320l-817Volume_1"') do (
    if not "%%~dpa"=="\dns320l-817Volume_1отобранные фото_тест" (
        for /f "tokens=1 delims=_" %%b in ("%%~nxa") do (
        if "%%b"=="%~1" (
            xcopy "%%a" "\dns320l-817Volume_1отобранные фото_тест"
            set /A count+=1
        )
    )
    )
)
if not defined count (
    echo %~1>>not_found.txt
) else (
    set count=
)
exit /b

Примечание. Сохранять строго в кодировке OEM-866



0



alpap

4331 / 2121 / 661

Регистрация: 26.04.2015

Сообщений: 6,823

05.02.2021, 22:40

10

viberezh, на powershell поаккуратнее будет, пути свои поставьте, кодировку использовал utf-8, должна работать и 1251

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
$mask=gc  'C:spisok.txt'
$sPath=   'C:XML'
$exclude= 'C:XMLотобранные фото_тест'
$noMatch= 'C:noMatch.txt'
 
$file=gci $sPath -at !d -rec|? {$_.FullName -notLike "$exclude*"}
 
foreach ($i in $mask) {
  $outTr=$file.FullName -Match "[^\]+\$i[^\]*.xml"
  if (!$outTr) {$i+'*.xml' >> $noMatch}
  else {cpi $outTr $exclude}
}

запускать так:

Windows Batch file
1
powershell -nol -nop -ex Bypass -file "%Userprofile%Desktopscript.ps1"



1



Поиск нескольких файлов одновременно

Алексей Цод



Ученик

(135),
на голосовании



12 лет назад

Всем привет, подскажите пожалйста: есть список файлов – надо с помощью тотал коммандера найти их в каталоге, причем инстересует поиск не по одному файлу, а в поисковом запросе указать все (10 штук), как это сделать?))

Голосование за лучший ответ

Что делать если нужно найти определённый документ среди десятка или сотен?

Если известно имя документа, то выполнить поиск довольно просто — многие программы, в том числе стандартный проводник Windows умеют искать по имени файла.

Чтобы найти файл по имени, откройте проводник (файловый менеджер) Windows, перейдите в папку, где вы хотите выполнить поиск и в поле «Поиск» введите имя файла или часть имени, чтобы найти все файлы, которые ему соответствуют:

Полнотекстовый поиск по папкам

Но что делать, если мы хотим найти файл по его содержимому? Например, нам известна фамилия, которая упоминается в документе.

Если вы ищете среди текстовых документов, то многие программы могут вам помочь, например, Total Commander и Double Commander могут искать по содержимому текстовых файлов.

Но если это офисные документы, то всё становится сложнее, поскольку файлы .docx, .doc и другие офисные форматы представляют собой довольно сложные контейнеры.

К счастью, самый обычный проводник Windows умеет делать полнотекстовый поиск по всем офисным форматам MS Office.

Чтобы искать по содержимому офисных документов, перейдите в папку, где находятся файлы, среди которых вы хотите выполнить поиск. В поле «Поиск» введите искомое слово или фразу. Нажмите на слово «Поиск» под фразой «Средства поиска»:

Нажмите на кнопку «Дополнительные параметры»:

Нажмите «Содержимое файлов»:

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

Как искать по файлам в ZIP архивах

Если файлы упакованы в ZIP архивы, то по умолчанию в них не выполняется поиск даже если включён поиск по содержимому файлов.

Чтобы включить поиск по ZIP архивам, введите слово для поиска, нажмите на слово «Поиск» под фразой «Средства поиска», нажмите на кнопку «Дополнительные параметры» и выберите «Сжатые ZIP-папки»:

Данные опции являются постоянными и сохраняются даже после закрытия проводника и перезагрузки компьютера. Если вы обычно ищите по имени файла (а не по его содержимому) и поиск для вас стал слишком медленным, то отключите эти опции в том же самом порядке, как показано их включение.

Как искать по точному совпадению. Как искать по фразе

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

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

В Windows 10

Тем не менее решение есть, для этого нужно использовать конструкцию ~=”ЗДЕСЬ ФРАЗА”

Чтобы было понятнее, допустим, нам нужно найти документы, содержащие точную фразу «Exa.ct Phr.ase», тогда в строку поиска нам нужно ввести:

~="Exa.ct Phr.ase"

В Windows 11

В Windows 11 для поиска точного совпадения по-прежнему работает конструкция ~=”НАЙДИ МЕНЯ”. Но на поиск сильно влияет индексирование файлов. Например, при включённом индексировании наблюдались следующие особенности:

  • конструкция ~=”НАЙДИ МЕНЯ” не работала
  • для поиска по точному совпадению фразы достаточно было поместить её в двойные кавычки
  • поиск по архивам не работал, хотя и был включён

После отключения индексирования папки, работа поиска стала аналогичной как в Windows 10. То есть если вы не знаете, включено ли индексирование папки, в которой вы выполняете поиск, то попробуйте оба описанных в данной статье способа и посмотрите, какой из них сработает.

Связанные статьи:

  • Как удалить Поле поиска и Кортану с Панели задач (100%)
  • Полнотекстовый поиск по офисным файлам (Word) и архивам — теперь это просто! (100%)
  • Как использовать подстановочные символы и регулярные выражения при поиске и замене в Word (50%)
  • Как в Microsoft Word сделать массовую замену или удаление текста (50%)
  • Как убрать лишние пробелы в Microsoft Word (50%)
  • Как определить, какая версия Windows установлена на компьютере: 32-битная или 64-битная? (RANDOM – 50%)

Андрей Викторов


  • #1

Коллеги, приветствую!
Имеется текстовый файл (*.txt) с неким набором данных вида
——————–
бла-бла-бла1
бла-бла-бла2
бла-бла-бла3
бла-бла-бла4
бла-бла-бла5
——————-
Это части имен файлов (цифры только чтобы показать что они разные).
Как «оптом» запустить, если в принципе возможно, поиск файлов, содержащих в именах все перечисленное?

densen


Андрей Викторов


  • #3

Но не зайти((
А возиться с обходными путями по некоторым причинам низя))

George

George

I wish I was a monster you think I am


  • #4

линкедин только через впн.

densen


  • #5

Но не зайти((
А возиться с обходными путями по некоторым причинам низя))

Объясню словами. Нужно упомянутый тобой тектовый файл положить в директорию, в которой будет производиться поиск, и в строку места поиска вбить путь к этому файлу и присовокупить спереди знак “@”.

  • tc_search.png

    tc_search.png

    9.9 КБ

    · Просм.: 112

Последнее редактирование: 28.08.2022

Андрей Викторов


  • #6

Не получается((

1661696846835.png

densen


  • #7

“-” и “–” являются разными символами, согласись.

Андрей Викторов


  • #8

Дык я список то этот в тхт из ТС скопировал (думал, что «К» могли быть русскими или наоборот)…

В редакторе вбиваю «минус» на цифровой клавиатуре. Он просто в редакторе отображается как тире.

Последнее редактирование: 28.08.2022

svlasov


  • #9

Я полагаю, что так работать не будет. В текстовом файле для поиска строки должны быть вида *k-0455*. Тогда сработает.

1661699387162.png

Последнее редактирование: 28.08.2022

Андрей Викторов


  • #10

Так и есть((
В таком случае проще в тексте символ перевода каретки заменить на «* *» + в конце и в начале «*»
и вставить в строку поиска…

edogs software

На сайте с 15.12.2005

Offline

775

14 декабря 2016, 12:32

#1

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft

Масол

На сайте с 01.12.2006

Offline

264

14 декабря 2016, 12:35

#2

FileLocator

Достаточно мощная утилита. По спискам тоже ищет.

u3Bepr

На сайте с 03.03.2011

Offline

60

14 декабря 2016, 12:58

#3

в тотале Alt+F7 и ищите файлы как угодно 🙂

список можно преобразовать в строку через пробел, типа “custom* single*”

1

sten-s

На сайте с 04.12.2009

Offline

92

14 декабря 2016, 13:02

#4

Масол:
FileLocator

Достаточно мощная утилита. По спискам тоже ищет.

спасибо! Подскажете, где там по файлу искать (списку имен), не могу найти(

———- Добавлено 14.12.2016 в 16:03 ———-

u3Bepr:
в тотале Alt+F7 и ищите файлы как угодно 🙂

там в сроку помещается ограниченно количество имен. как сразу искать по 200 имен не понятно

SeVlad

На сайте с 03.11.2008

Offline

1561

15 декабря 2016, 08:15

#5

sten-s:
там в сроку помещается ограниченно количество имен.

Не “ограниченно количество имен”, а 2047 символов.

sten-s:
как сразу искать по 200 имен не понятно

Можно использовать регулярки.

Можно переключиться на вкладку “плагины” стандартного поиска ТС.

Можно спросить на руборде, а тут потом поделиться найденным решением.

Делаю хорошие сайты хорошим людям. Предпочтение коммерческим направлениям. Связь со мной через http://wp.me/P3YHjQ-3.

PA

На сайте с 12.02.2016

Offline

24

15 декабря 2016, 10:47

#6

как все тут сложно… 🙂

sten-s:
Есть список названий файлов – около 2000. Нужно их все найти на компе. Вроде, простая задача, но не пойму как это сделать. в тотал коммандере нет такого( или я не нашел

1. Создаем список существующих файлов на компе с полными путями.

find . -type f >filelist.txt

2. Из этого списка выбираем необходимые “около 2000” файлов.

grep -f search2000.txt filelist.txt >result.txt

Это все.

Под виндой есть порты финда и грепа.

Upd: почитал хелп у дир-а, под виндай первый пункт можно сделать нативно:

dir /b /s /a:-d >filelist.txt

. . .

SeVlad

На сайте с 03.11.2008

Offline

1561

15 декабря 2016, 14:48

#7

ps axf:
Создаем список существующих файлов на компе с полными путями.

А???!!!!

Моё сердце стало быстрее, чем взорвался процессор и кончилась память компа 🙂

1

Добавить комментарий