Обновление 2010-11-02 7p: Сокращенное описание;опубликовано исходное решение для bash.
Описание
Я хотел бы создать семантическую файловую структуру для лучшей организации моих данных.Я не хочу идти по пути, подобному повторению, стриги или гончей;Я не хочу никакого графического интерфейса и полного контроля.Самый близкий может быть oyepa или даже ближе, Tagsistant .
Вот идея: каждый поддерживает "регулярное" дерево своих файлов.Например, мои организованы в папки проектов, как это:
,---
| ~/proj1
| ---- ../proj1_file1[tag1-tag2].ext
| ---- ../proj1_file2[tag3]_yyyy-mm-dd.ext
| ~/proj2
| ---- ../proj2_file3[tag2-tag4].ext
| ---- ../proj1_file4[tag1].ext
`---
proj1, proj2 - это очень короткие сокращения, которые я имею для своих проектов.
Тогда то, что я хочу сделать, - это рекурсивно пройти черезкаталог и получите следующее:
- идентификатор проекта
- теги
- расширение
Каждый из них будет составлять полный "список тегов »для каждого файла.
Затем в определяемом пользователем каталоге на основе этих тегов будет создана« семантическая иерархия ».Это займет немного времени, поэтому просто взгляните на структуру каталогов, созданную для всех файлов, содержащих имя tag2:
,---
| ~/tag2
| --- ../proj1_file1[tag1-tag2].ext -> ~/proj1/proj1_file1[tag1-tag2].ext
| --- ../proj2_file3[tag2-tag4].ext -> ~/proj2/proj2_file3[tag2-tag4].ext
| ---../tag1
| ------- ../proj1_file1[tag1-tag2].ext -> ~/proj1/proj1_file1[tag1-tag2].ext
| --- ../tag4
| ------- ../proj2_file3[tag2-tag4].ext -> ~/proj2/proj2_file3[tag2-tag4].ext
| --- ../proj1
| ------- ../proj1_file1[tag1-tag2].ext -> ~/proj1/proj1_file1[tag1-tag2].ext
| --- ../proj2
| ------- ../proj2_file3[tag2-tag4].ext -> ~/proj2/proj2_file3[tag2-tag4].ext
`---
Другими словами, каталоги создаются со всеми комбинациями тегов файла, икаждый содержит символическую ссылку на фактические файлы, имеющие эти теги.Я опустил каталоги типов файлов, но они также существуют.Это выглядит действительно грязно по типу, но я думаю, что эффект будет очень круто.Затем можно было бы отобрать данный файл по ряду «пометок крошки».
Мои мысли пока:
- ls -R в верхнем каталоге, чтобы получить все имена файлов
- идентифицируйте эти файлы с помощью [и] в имени файла (помеченные файлы)
- с тем, что осталось, введите цикл:
- вычеркните идентификатор проекта, теги ирасширение
- создать все необходимые каталоги на основе тегов
- создать символические ссылки на файл во всех созданных каталогах
Первое решение!2010-11-3 7p
Вот мой текущий рабочий код.Он работает только с файлами в каталоге верхнего уровня, пока не определяет типы расширений и работает только с 2 тегами + идентификатором проекта, всего 3 тега на файл.Это взломанное решение ручной проверки, но, возможно, оно поможет кому-то увидеть, что я делаю, и как это может быть намного лучше:
#!/bin/bash
########################
#### User Variables ####
########################
## set top directory for the semantic filer
## example: ~/semantic
## result will be ~/semantic/tag1, ~/semantic/tag2, etc.
top_dir=~/Desktop/semantic
## set document extensions, space separated
## example: "doc odt txt"
doc_ext="doc odt txt"
## set presentation extensions, space separated
pres_ext="ppt odp pptx"
## set image extensions, space separated
img_ext="jpg png gif"
#### End User Variables ####
#####################
#### Begin Script####
#####################
cd $top_dir
ls -1 | (while read fname;
do
if [[ $fname == *[* ]]
then
tag_names=$( echo $fname | sed -e 's/-/ /g' -e 's/_.*\[/ /' -e 's/\].*$//' )
num_tags=$(echo $tag_names | wc -w)
current_tags=( `echo $tag_names | sed -e 's/ /\n/g'` )
echo ${current_tags[0]}
echo ${current_tags[1]}
echo ${current_tags[2]}
case $num_tags in
3)
mkdir -p ./${current_tags[0]}/${current_tags[1]}/${current_tags[2]}
mkdir -p ./${current_tags[0]}/${current_tags[2]}/${current_tags[1]}
mkdir -p ./${current_tags[1]}/${current_tags[0]}/${current_tags[2]}
mkdir -p ./${current_tags[1]}/${current_tags[2]}/${current_tags[0]}
mkdir -p ./${current_tags[2]}/${current_tags[0]}/${current_tags[1]}
mkdir -p ./${current_tags[2]}/${current_tags[1]}/${current_tags[0]}
cd $top_dir/${current_tags[0]}
echo $PWD
ln -s $top_dir/$fname
ln -s $top_dir/$fname ./${current_tags[1]}/$fname
ln -s $top_dir/$fname ./${current_tags[2]}/$fname
cd $top_dir/${current_tags[1]}
echo $PWD
ln -s $top_dir/$fname
ln -s $top_dir/$fname ./${current_tags[0]}/$fname
ln -s $top_dir/$fname ./${current_tags[2]}/$fname
cd $top_dir/${current_tags[2]}
echo $PWD
ln -s $top_dir/$fname
ln -s $top_dir/$fname ./${current_tags[0]}/$fname
ln -s $top_dir/$fname ./${current_tags[1]}/$fname
cd $top_dir
;;
esac
fi
done
)
На самом деле это довольно аккуратно.Если вы хотите попробовать это, сделайте следующее:
- создайте каталог где-нибудь
- используйте touch для создания группы файлов в формате выше: proj_name [tag1-tag2] .ext
- определить переменную top_dir
- запустить скрипт
- play play!
ToDo
- сделать эту работу, используя "ls -R", чтобы войти в подкаталоги моего реального дерева.
- проверка надежности
- рассмотреть возможность переключения языков;эй, я всегда хотел выучить Perl и / или Python!
Все еще открыт для любых ваших предложений.Спасибо!