jest kilka takich narzędzi commanline w Linux, których braqje w Windows. jednym jest 'du’ czyli Disk Usage liczący wielkość katalogu. to można sobie łatwo oprogramować:
(ls -r -force <dir> -ea silentlycontinue|measure -property length -sum).sum/1GB
to oczywiście na szybko, można to upiększać, dodać skrypt dostępny globalnie – prościzna. drugim bardzo często narzędziem, z którego często korzystałem było 'locate’. w Linuxie super przydatne głównie z tego powodu, że każde distro się różni i pliki są rozpizgane po setkach katalogów. Linuxowa masakra. ale locate przeważnie jest a to poważnie ułatwia życie. idea jest taka sama jak w Windows – działa sobie indexer, który skanuje katalogi i tworzy indexy dla pliqw. można go wymusić do odświeżenia przy pomocy 'updatedb’. w Windows jest 'Windows Search’, czyli WSearch [w wXP był Indexing Service]. problem polega na tym, że nie ma standardowych narzędzi commandline. co prawda jest od jakiegoś czasu moduł WindowsSearch ale służy wyłącznie do konfiguracji usługi. w starym Windows Desktop Search był trick na skorzystanie z linii poleceń. jeśli jest w nowej wersji – nie znam go.
oczywiście jest API. a to daje możliwość oprogramowania sobie searcher. doqmentacja dot. tworzenia zapytań jest na MSDN. a przykładowy draft skryptu tu:
locate-File.ps1
<#
.SYNOPSIS
locate function to quickly find files using windows search index
.NOTES
author: nExoR 2o14
version: 03.11.2o14
.IDEAS
add search parameters:
- search for file contents
- only in specyfic files [doc/pdf]
.EXAMPLE
locate-file *hidden*.ps1
.LINK
https://w-files.pl
http://blogs.technet.com/b/heyscriptingguy/archive/2010/05/30/hey-scripting-guy-weekend-scripter-using-the-windows-search-index-to-find-specific-files.aspx
https://msdn.microsoft.com/en-us/library/bb231256%28v=VS.85%29.aspx
#>
param(
[parameter(mandatory=$true)][string]$fileName,
[int]$pageSize=20000
)
$fileName=$fileName.Replace('*','%')
$query = "SELECT `
System.ItemName, system.ItemPathDisplay, System.ItemTypeText,System.DateCreated,System.DateModified,`
System.FileAttributes,System.FileOwner,System.Size `
FROM SystemIndex where system.fileName LIKE '$fileName'"
#https://social.technet.microsoft.com/Forums/scriptcenter/en-US/c262d5de-da6b-4e9e-9aab-2965f3109b8a/vbs-looking-for-script-to-change-windows-search-property?forum=ITCG
$ADOCommand = New-Object -ComObject adodb.command
$ADOConnection = New-Object -ComObject adodb.connection
$RecordSet = New-Object -ComObject adodb.recordset
$ADOConnection.open("Provider=Search.CollatorDSO;Extended Properties='Application=Windows';")
$RecordSet.pageSize=$pageSize
$RecordSet.open($query, $ADOConnection)
Try { $RecordSet.MoveFirst() }
Catch [system.exception] { "no records returned" }
while(-not($RecordSet.EOF))
{
if($locatedFile){Remove-variable locatedFile}
$locatedFile=new-object -typeName PSObject
add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'Name' -Value ($RecordSet.Fields.Item("System.ItemName")).value
add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'Path' -Value ($RecordSet.Fields.Item("System.ItemPathDisplay")).value
add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'Type' -Value ($RecordSet.Fields.Item("System.ITemTypeText")).value
add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'DateCreated' -Value ($RecordSet.Fields.Item("System.DateCreated")).value
add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'DateModified' -Value ($RecordSet.Fields.Item("System.DateModified")).value
add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'FileAttributes' -Value ($RecordSet.Fields.Item("System.FileAttributes")).value
add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'FileOwner' -Value ($RecordSet.Fields.Item("System.FileOwner")).value
add-member -inputObject $locatedFile -MemberType NoteProperty -Name 'Size' -Value ($RecordSet.Fields.Item("System.Size")).value
$locatedFile
$RecordSet.MoveNext()
}
$RecordSet.Close()
$ADOConnection.Close()
$RecordSet = $null
$ADOConnection = $null
[gc]::collect()
to oczywiście wersja robocza. proof of concept. napisane tak, żeby zwracało ładne obiekty. ogólna idea to podłączenie się do bazy zawierającej indexy przy pomocy ADO i wykonanie kwerendy. wyniki podawane są niemal natychmiast tylko trzeba pamiętać, że są tam wyłącznie katalogi zindexowane – jeśli chcemy móc wyszukiwać po całym dysq, to trzeba dodać cały dysk do indexowania…
…a jeśli nie zależy nam na czasie to można szukać 'po staremu’:
ls <dir> -r -force -ea silentlycontinue <file-to-search>
eN.
PowerShell dla początqjących
zapraszam!
eN.