bash для создания семантической структуры файла - PullRequest
2 голосов
/ 02 ноября 2010

Обновление 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!

Все еще открыт для любых ваших предложений.Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 ноября 2010

Хм, большая проблема, слишком большая для короткого перерыва ...

Но я могу привести вам пример одного из различных способов структурирования сценария ...

#!/bin/sh

ls -1 / | (while read fname; do
    echo "$fname"
    test=hello
    # example transformation...
    test2=`echo $fname | tr a-z A-Z`
    echo "$test2"
  done
  echo post-loop processing here, $test
  # then finally close the subshell with a right paren
)
0 голосов
/ 02 ноября 2010

Может быть, что-то вроде этого для каждого тега?

find . -type f|grep -Z "[[-]$tag[]-]"| \
xargs -0 -I %%% ln -s "../../%%%" "tagfolder/$tag/"

Примечание: вторая строка не работает, не знаю почему.

...