Организация файлов по ключевым словам в именах файлов

377
digital-Ink

У меня на компьютере много (то есть, более 10 000) документов, которые я хочу организовать по нескольким категориям на основе их имен файлов. Большинство файлов имеют описательные имена файлов, так что их можно легко классифицировать только по их именам.

Я подумал о создании индекса слов, которые появляются в именах файлов (пока я не знаю, как этого добиться), затем просмотр индекса и выбор наиболее подходящих слов (это будет сделано вручную), которые станут Названия категорий для моих файлов. Затем я хочу автоматически создавать папки на основе этих имен категорий и перемещать файлы (автоматически) в эти папки. Когда файл принадлежит нескольким категориям, я хочу создать NTFS HardLinks (а не копировать каждый файл несколько раз).

Я использую Windows 7. Знаете ли вы, как мне лучше всего решить эту задачу?

Я думал об использовании « Все» (которое может мгновенно отображать список всех файлов, для которых задано слово в именах файлов), но основная проблема заключается в получении имен категорий (поскольку сначала мне нужен список всех слов, которые появляются в именах файлов).

2
+1 интересно посмотреть, что придет в ответах. Вы могли бы, вероятно, добиться этого в powershell, используя Get-ChildItem -recurse и затем используя ForEach для передачи возвращаемых файлов. намного лучше, если есть кое-что, что уже делает это все же. James 10 лет назад 1
Не могли бы вы опубликовать пару примеров имен файлов, чтобы мы могли увидеть шаблон именования. Martin 10 лет назад 0
@Martin: Многие из них книги, другие статьи исследований. Обычно заголовок содержит автора, его инициалы, название книги или статьи. Некоторые имена файлов содержат _ вместо «пробел». digital-Ink 10 лет назад 0

1 ответ на вопрос

1
Martin

Short PowerShell script that lists all the filenames that match "category_name-anyText.anyExtension".:

$dir="Q:\Test"; $categories="Q:\categories.txt"; $cats=@{}; get-childitem $dir -recurse | %{ $file=$_; if(-not $file.PSIsContainer) { if( $file.BaseName -match "^([a-z0-9]+)[-]+.*$") { if( -not $cats.ContainsKey($matches[1])) { $cats.add($matches[1], [int]1); } else { $val=$cats.Get_Item($matches[1]) + 1; $cats.Set_Item($matches[1], $val); } } } } $cats.GetEnumerator() | %{ echo $_.Key >> $categories; } 

Example: Files:

 David_Eddings-The_Mallorean.epub Jan_Myrdal-Confessions_of_a_disloyal_european.txt George_Orwell-Homage_to_Catalonia.mobi 

Would result in the following categories:

 David_Eddings Jan_Myrdal George_Orwell 

This is the regex that matches filenames: "^([a-z0-9]+)[-]+.*$", this would have to be adjusted to match different categories.