用于创建语义文件结构的 bash

发布于 2024-09-30 07:41:48 字数 4277 浏览 7 评论 0原文

更新2010-11-02 7p:缩短描述;发布了最初的 bash 解决方案。


描述

我想创建一个语义文件结构以更好地组织我的数据。我不想走像 recoll、strigi 或 beagle 这样的路线;我想要没有图形用户界面和完全控制。最接近的可能是 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 是我的项目的非常简短的缩写。

然后我想要做的是递归地遍历目录并获取以下内容:

  • proj 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 个标签。这是一个被破解的手动突突解决方案,但也许它可以帮助别人了解我在做什么以及如何做得更好:

#!/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 变量
  • 运行脚本

ToDo

  • 中的子目录,
  • 使用“ls -R”进行这项工作,以便进入我实际的树稳健性检查
  • 考虑切换语言;嘿,我一直想学习 perl 和/或 python!

仍然愿意接受您的任何建议。谢谢!

Update 2010-11-02 7p: Shortened description; posted initial bash solution.


Description

I'd like to create a semantic file structure to better organize my data. I don't want to go a route like recoll, strigi, or beagle; I want no gui and full control. The closest might be oyepa or even closer, Tagsistant.

Here's the idea: one maintains a "regular" tree of their files. For example, mine are organized in project folders like this:

 ,---
 | ~/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 are very short abbreviations I have for my projects.

Then what I want to do is recursively go through the directory and get the following:

  • proj ID
  • tags
  • extension

Each of these will be form a complete "tag list" for each file.

Then in a user-defined directory, a "semantic hierarchy" will be created based on these tags. This gets a bit long, so just take a look at the directory structure created for all files containing tag2 in the name:

,---
| ~/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
`---

In other words, directories are created with all combinations of a file's tags, and each contains a symlink to the actual files having those tags. I have omitted the file type directories, but these would also exist. It looks really messy in type, but I think the effect would be very cool. One could then fine a given file along a number of "tag bread crumbs."

My thoughts so far:

  • ls -R in a top directory to get all the file names
  • identify those files with a [ and ] in the filename (tagged files)
  • with what's left, enter a loop:
    • strip out the proj ID, tags, and extension
    • create all the necessary dirs based on the tags
    • create symlinks to the file in all of the dirs created

First Solution! 2010-11-3 7p

Here's my current working code. It only works on files in the top level directory, does not figure out extension types yet, and only works on 2 tags + the project ID for a total of 3 tags per file. It is a hacked manual chug solution but maybe it would help someone see what I'm doing and how this could be muuuuch better:

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

It's actually pretty neat. If you want to try it, do this:

  • create a dir somewhere
  • use touch to create a bunch of files with the format above: proj_name[tag1-tag2].ext
  • define the top_dir variable
  • run the script
  • play around!

ToDo

  • make this work using an "ls -R" in order to get into sub-dirs in my actual tree
  • robustness check
  • consider switching languages; hey, I've always wanted to learn perl and/or python!

Still open to any suggestions you have. Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ㄟ。诗瑗 2024-10-07 07:41:48

嗯,大问题,太大了,无法在短暂的休息时间内完成...

但我可以给您一个示例,说明构建脚本的各种方法之一...

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

Hmm, big problem, too big to do on a short break...

But I can give you an example of one of the various ways you could structure the script...

#!/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
)
海未深 2024-10-07 07:41:48

也许每个标签都是这样的?

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

注意:第二行实际上不起作用,不知道为什么。

Maybe something like this for each tag?

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

Note: The second line doesn't really work, don't know why.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文