2010-11-02 65 views
2

更新2010-11-02 7p:縮短描述;發佈初始bash解決方案。用於創建語義文件結構的bash


說明

我想創建一個語義文件結構,以更好地組織我的數據。我不想像recoll,strigi或beagle那樣走路;我不需要gui和完全控制。最接近的可能是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是我爲我的項目製作的非常簡短的縮寫。

那我想要做的是遞歸去通過目錄,並得到如下:

  • 凸出ID
  • 標籤
  • 擴展

每個將要形成完成每個文件的「標籤列表」。

然後在用戶定義的目錄中,將根據這些標籤創建「語義層次結構」。這變得有點長,所以只是看看包含在名稱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在頂級目錄來獲取所有的文件名
  • 在文件名中識別這些文件用[和](標記文件)
  • 與還剩下些什麼,進入一個循環:
    • 帶出,該凸出ID,標籤和擴展
    • 創建一個基於標籤的所有必要迪爾斯
    • 創建符號鏈接到所有迪爾斯的文件中創建

首個解決方案! 2010-11-3 7p

這是我目前的工作代碼。它僅適用於頂級目錄中的文件,尚未找出擴展類型,僅適用於2個標籤+項目ID,每個文件總共3個標籤。這是一個黑客手動突突解決方案,但也許這將幫助別人看到我在做什麼,這怎麼會是muuuuch更好:

#!/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 
) 

這其實很整潔。如果您想嘗試一下,這樣做:

  • 創建一個目錄的地方
  • 使用觸摸創建一批具有上述格式的文件:PROJ_NAME [標籤1,標籤2] .EXT
  • 定義top_dir變量
  • 運行腳本
  • 玩過!

待辦事項

  • 爲了進入子迪爾斯在我的實際樹
  • 穩健性檢驗
  • 考慮切換語言使用的「ls -R」,使這項工作;嘿,我一直想學習Perl和/或Python!

仍然開放您的任何建議。謝謝!

回答

0

也許這樣的每個標籤?

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

注意:第二行並不真正起作用,不知道爲什麼。

+0

不能完全使用grep命令來工作......我必須研究這是如何工作的;我只是對文字進行了粗淺的處理,並不熟悉你用來尋找標籤的blob。 – Hendy 2010-11-02 19:56:45

+0

@昂蒂:對不起,該版本已損壞。更新了grep部分。 – thejh 2010-11-02 20:08:54

0

嗯,很大的問題,大到上休息片刻做...

,但我可以給你的,你可以構建腳本中的各種方式中的一個例子...

#!/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

雖然閱讀fname很有幫助。那很棒。除此之外,這不是我想要做的。不過,使用你的ls循環,我可以做到這一點,這是一個開始:ls -1 | (while read fname; do tags = $(echo $ fname | sed -e's/-// g'-e's /_.*\[/ /'-e's /\].*$/ /') echo $ tags done ) – Hendy 2010-11-02 20:08:16