Есть ли что-то вроде команды GNU locate в PowerShell?

Есть ли эквивалент GNU locate команда в Windows 7/8?

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

locate file-with-long-name.txt
/var/www/file-with-long-name.txt

5 ответов

Решение

Нет, нет встроенного командлета Windows или PowerShell, эквивалентного Linux/GNU locate команда. Однако функциональные эквиваленты включают в себя cmd.exe dir /s как описано JKarthikи эти параметры PowerShell:

PS> Get-ChildItem -Recurse . file-with-long-name.txt

Обратите внимание на использование ., сообщая PowerShell, с чего начать поиск. Вы можете, конечно, сократить при наборе в командной строке:

PS> gci -r . file-with-long-name.txt

Я делаю это много, поэтому я добавил функцию в свой профиль:

PS> function gcir { Get-ChildItem -Recurse . @args }
PS> gcir file-with-long-name.txt

Это позволяет подстановочные знаки, похожие на locate:

PS> gcir [a-z]ooo*.txt

Увидеть help about_Wildcards Больше подробностей. Это также может быть написано с Where-Object как это:

PS> gcir | where { $_ -like "[a-z]ooo*.txt"}

locate имеет возможность сопоставить с регулярными выражениями. Как и PowerShell:

PS> gcir | where { $_ -match "A.*B" }

PowerShell поддерживает полные регулярные выражения.NET. Увидеть about_Regular_Expressions,

Вы также можете выполнять другие типы запросов:

PS> gcir | where { $_.Length -gt 50M }  # find files over 50MB in size

Производительность этих подходов медленна для больших коллекций файлов, поскольку она просто ищет файловую систему. GNU locate использует базу данных. В Windows теперь есть база данных с возможностью поиска, которая называется Windows Desktop Search. Существует API для WDS, который кто-то обернул командлетом PowerShell, здесь: http://www.codeproject.com/Articles/14602/Windows-Desktop-Search-Powershell-Cmdlet, позволяющий выполнять следующие действия:

PS> get-wds “kind:pics datetaken:this month cameramake:pentax” 

с гораздо лучшей производительностью, чем Get-ChildItemи этот вид богатого запроса (и неудобного синтаксиса). Также обратите внимание, что фигурные кавычки прекрасно работают в PowerShell, поэтому нет необходимости редактировать этот образец при его копировании / вставке.

Может быть, кто-то найдет (или напишет) командлеты PowerShell, которые разрешают идиоматические запросы к WDS.

Для решения PowerShell попробуйте следующее:

Get-ChildItem -Filter "file-with-long-name.txt" -Recurse

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

-Filter Параметр принимает подстановочные знаки. Если текущий каталог содержит системные файлы, к которым у вас нет доступа, добавьте -ErrorAction SilentlyContinue подавить ошибки.

Для получения дополнительной информации см. Get-Help Get-ChildItem,

Вы можете использовать следующую команду в оболочке Windows:

dir [filename] /s

Где имя файла - это имя файла, который вы ищете, и /s относится к подкаталогам в поиске.

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

Попробуйте:

 dir [filename] /s /B

Источник: Windows 8 Список командной строки и справочник

Вы можете установить Cygwin, чтобы имитировать набор инструментов Linux, или установить порт MinGW, и вы получите доступ к оболочке, почти знакомой с родной системой Linux.

Если вы не привыкли к поиску UNIX , вы не знаете, чего вам не хватает.

locateмгновенно возвращает имена файлов только с каждого диска вашего ПК .

Введите:

найдите какое-нибудь имя файла

и каждое указанное имя будет отображаться мгновенно . Он НЕ будет искать фрагменты внутри ваших файлов. Скорость определяется базой данных, запущенной с помощью updateb , что может занять некоторое время и обычно представляет собой ежедневное задание cron.

Я не смог найти ничего полезного в этой теме, поэтому добавил свое решение: установите Cygwin64, откройте терминал, обновите b , затем найдите

Я провел тест, чтобы выявить различия в производительности, я выполнил поиск putty.exe.

На Win10 это заняло 12 минут 50 секунд в проводнике и 4 секунды в терминале Cygwin.

Меня не интересовали фрагменты, что было «бонусом» при поиске в Проводнике, из-за которого поиск занимал больше времени. Да, индексация включена.

Другие вопросы по тегам