Лучший способ отсканировать 500 тысяч папок/файлов и вывести .txt с путями?

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

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

Z:\folder\folder2\folder3\folder4\folder5\folder6\folder7\ <about another 20 folders > \log.txt

Текущая команда:

dir /b /-d /-p /s /A:-D > directories.txt

В текстовом файле около 500 тысяч строк.

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

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

Вопрос:

Итак, вопрос к вам, ребята, как лучше всего это сделать? Я не могу изменить ни одну из структур каталогов (это база данных журналов, используемая сотнями людей), и я действительно не знаю никаких языков, кроме пакетных сценариев. Но похоже, что Batch ограничен и не позволяет мне делать что-либо из следующего (что решило бы мою проблему)

  • Пропускать каталоги, которые не изменялись за последние 48 часов.
  • Пропускать подкаталоги папок с определенными ключевыми словами в названии

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


person Duxa    schedule 05.06.2014    source источник
comment
Это не полное решение, но оно может дать вам представление. Как вы знаете, Python прост в освоении. Для вашей операции вам не нужно изучать его полностью. Так что смотрите только это, чтобы открыть свой разум. stackoverflow.com/questions/120656/directory-listing-in-python< /а>   -  person hakiko    schedule 05.06.2014
comment
Что вы просите, найти файлы и вывести их с их путями или сделать это, но только для файлов, измененных за последние 48 часов? Пожалуйста, сформулируйте свой вопрос более кратко.   -  person Ian Stevens    schedule 05.06.2014
comment
@IanStevens: он надеется ускорить работу, пропуская старые файлы, но чтобы узнать возраст файлов, необходимо прочитать запись в каталоге. Так что это не сделает ничего быстрее. Пропуск некоторых каталогов ускорит работу, но для этого потребуется код.   -  person Stephan    schedule 07.06.2014
comment
@Stephan Да, я пробовал Cygwin запускать сценарий bash, и это заняло столько же времени, если не больше, я тоже избегаю тонны каталогов во время процесса. Интересно, cmd просто намного быстрее, чем cygwin в Windows.   -  person Duxa    schedule 09.06.2014


Ответы (2)


Если вы можете установить Cygwin на машину, это даст вам доступ к использованию bash вместе с инструментами grep / find / etc., которые являются стандартными в Unix/Linux/BSD и будут работать в Windows под оболочкой Cygwin. Затем вы можете использовать различные решения, такие как:

Grep внутри всех файлов, созданных в пределах диапазона дат

В противном случае вам, вероятно, придется инвестировать в изучение Powershell.

person tgharold    schedule 05.06.2014
comment
Да, я могу установить Cygwin, я посмотрю на это. Спасибо! - person Duxa; 06.06.2014
comment
Я установил Cygwin, вопрос в том, какие команды мне нужно использовать. Использование find, похоже, ищет ключевую строку внутри каждого текстового файла. Что делает это дольше. Мне просто нужно, чтобы он смотрел на имена папок, и если он попадает в определенные, чтобы пропустить все подкаталоги (на основе ключевого слова как части имени). - person Duxa; 06.06.2014
comment
Команда «find», при условии, что вы используете правильный аргумент -mtime, будет искать внутри файлов только за последние 48 часов. Например, find -mtime -2 будет отображать только файлы, созданные в течение последних 2 дней. Вы также можете выбрать поиск только для каталогов с определенным ключевым словом в имени, измененным в течение последних N дней, и передать этот список через xargs во второй поиск для фактического grep. - person tgharold; 10.06.2014
comment
Хороший способ проверить 'find' - использовать find . -mtime -2 | wc -l, который сообщит вам, сколько вещей нашла ваша команда «найти». И найти . | wc -l сообщит вам общее количество вещей, которые можно найти. найти . -тип д | wc -l для количества каталогов и т. д. - person tgharold; 10.06.2014

>"output.txt" robocopy z:\ "%temp%" /l /s /nc /ns /njh /njs /ndl /fp /maxage:2 /xd folder7 otherFolder 

Robocopy (начиная с Windows Vista и выше, но доступный в W2003 Resource Kit Tools) можно использовать для получения рекурсивного списка файлов с указанными условиями: изменение за последние два дня и исключение некоторых папок из процесса.

person MC ND    schedule 06.06.2014