更新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!
仍然開放您的任何建議。謝謝!
不能完全使用grep命令來工作......我必須研究這是如何工作的;我只是對文字進行了粗淺的處理,並不熟悉你用來尋找標籤的blob。 – Hendy 2010-11-02 19:56:45
@昂蒂:對不起,該版本已損壞。更新了grep部分。 – thejh 2010-11-02 20:08:54