Mise à jour 2010-11-02 7p: Description abrégée; solution de bash initiale affichée.bash pour la création de structure de fichier sémantique
Description de
Je voudrais créer une structure de fichier sémantique pour mieux organiser mes données. Je ne veux pas suivre une route comme recoll, strigi ou beagle; Je ne veux aucun gui et contrôle total. Le plus proche pourrait être oyepa ou même plus proche, Tagsistant.
Voici l'idée: on maintient un arbre "régulier" de leurs fichiers. Par exemple, le mien sont organisés dans des dossiers de projet comme celui-ci:
,---
| ~/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 sont des abréviations très courtes que j'ai pour mes projets.
Alors ce que je veux faire est d'aller récursive dans le répertoire et obtenir les éléments suivants:
- proj ID
- balises
- l'extension
Chacun d'entre eux seront former un compléter la "liste des étiquettes" pour chaque fichier. Puis, dans un répertoire défini par l'utilisateur, une «hiérarchie sémantique» sera créée sur la base de ces balises. Cela devient un peu long, donc il suffit de prendre un coup d'œil à la structure de répertoire créé pour tous les fichiers contenant tag2 au nom:
,---
| ~/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
`---
En d'autres termes, les répertoires sont créés avec toutes les combinaisons de balises d'un fichier, et chacun contient un lien symbolique vers les fichiers réels ayant ces balises. J'ai omis les répertoires de type de fichier, mais ceux-ci existeraient également. Il a l'air vraiment en désordre dans le type, mais je pense que l'effet serait très cool. On pourrait ensuite affiner un fichier donné le long d'un certain nombre de "miettes de pain tag".
Mes pensées à ce jour:
- ls -R dans un répertoire haut pour obtenir tous les noms de fichiers
- identifier les fichiers avec le nom de fichier [et] (fichiers marqués)
- avec ce qui reste, entrez une boucle:
-
bande
- sur l'ID proj, les balises, et l'extension
- créer tous les répertoires nécessaires en fonction des balises
- créer des liens symboliques dans le fichier dans tous les répertoires créés
première solution! 2010-11-3 7p
Voici mon code de travail actuel. Il ne fonctionne que sur les fichiers du répertoire de premier niveau, ne comprend pas encore les types d'extension et ne fonctionne que sur 2 tags + l'ID du projet pour un total de 3 tags par fichier.Il est une solution de teuf manuel piraté, mais il serait peut-être aider quelqu'un voir ce que je fais et comment cela pourrait être mieux 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
)
Il est en fait assez propre. Si vous voulez l'essayer, faites ceci:
- créer un répertoire quelque part
- touche utiliser pour créer un tas de fichiers avec le format ci-dessus: nom_proj [balise1-tag2] .ext
- définir la top_dir
- exécutez le script
- jouez!
ToDo
- faire ce travail en utilisant un "ls -R" pour entrer dans les sous-répertoires dans mon arbre réel
- vérifier la robustesse
- envisager de passer des langues; hé, j'ai toujours voulu apprendre perl et/ou python!
Toujours ouvert à toutes les suggestions que vous avez. Merci!
Je n'arrive pas à faire fonctionner la commande grep ... Je vais devoir regarder comment ça marche; Je n'ai jamais que des mots et je ne suis pas familier avec le blob que vous utilisez pour chercher les tags. – Hendy
@Hendy: Désolé, cette version était cassée. Mise à jour de la partie grep. – thejh