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.