Quick post to add to the recent command line fu I've been writing about.
Nikola has a plugin tags which lets you manage tags from the command line. For instance:
nikola tags -a netlogo posts/somepost.org
Would add the tag netlogo to the specified post.
The problem: The tags plugin only works if the post has a **tag:** line already present in it's header comment and I hadn't put them in my older posts.
I had a bunch of posts, all of them in one directory. All the new ones were **.org** files and had the tag slug. The others were **.md** markdown files and **.html** html files.
Here's what a typical top block looks like:
<!-- title: "Looking for interesting questions" date: 2010-01-03 -->
Sed to the rescue. Here's the what I ended up typing (from within the posts directory) to add the **tags** slug to the top comments right above the **.. type: text:** line:
ls *md *html | while read filename do sed "/type: text/ i .. tags: " $filename done
ls *md *html
| while read filename
sed "/ type: text/ i .. tags: " $filename
A line at a time: This lists all the files with that end in md or html** The vertical bar (pipe) sends the output of **ls into the while read** command. The **while command sets up a loop which, each time through, reads the next input and places into the variable **filename**. The body of the loop is between the do and the **done**. Sed is the stream editor. The stuff between the slashes finds the line with the text type: text in it. The i inserts a line above and the rest of the stuff in the quotes is what to insert. The **$filename** expands to each filename, one each time through the loop.
Now all of my files have blank tag slugs so I can find my netlogo posts and tag them:
nikola tags -a netlogo `grep -i -l netlogo posts/*`
Any command in backticks expands to the result of the commmand. The grep command has two argiments: -i means ignore case so it will find netlogo, NetLogo, NETLOGO, etc.. The -l tells grep to just output the filenames. So, the grep command will expand to a list of files that mention netlogo. The full command adds the netlogo tag to all of them.
So, just a bit of quick shell scripting and I've:
- modified all old posts to accept tags.
- added the netlogo tag to all my netlogo posts.
You can find all those posts here.Tweet