7

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

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

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

3 ответа3

7

Нет, нет встроенного командлета Windows или PowerShell, эквивалентного команде locate в Linux/GNU. Однако функциональные эквиваленты включают 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.

2

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

dir [filename] /s

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

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

Попробуйте:

 dir [filename] /s /B

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

2

Для решения PowerShell попробуйте это:

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .