This blog has moved! Redirecting...
You should be automatically redirected. If not, visit and update your bookmarks.

Friday, October 03, 2008

Bash process substitution

From the Advanced Bash-Scripting Guide:

"Piping the stdout of a command into the stdin of another is a powerful technique. But, what if you need to pipe the stdout of multiple commands? This is where process substitution comes in.

Process substitution feeds the output of a process (or processes) into the stdin of another process."

The syntax is:


Example: comparing the head of two files using diff

$ diff -u <(head -n3 /var/log/dmesg) <(head -n3 /tmp/dmesg)
--- /proc/self/fd/63 2009-05-26 19:52:45.144544140 +0100
+++ /proc/self/fd/62 2009-05-26 19:52:45.149544007 +0100
@@ -1,3 +1,3 @@
-Initializing cgroup subsys cpuset
-Initializing cgroup subsys cpu
-Linux version (
(gcc version 4.3.2 20081105 (Red Hat 4.3.2-7) (GCC) )
#1 SMP Mon Mar 23 23:37:54 EDT 2009
+Linux version (
(gcc version 4.1.2 20070626 (Red Hat 4.1.2-13))
#1 SMP Thu Sep 27 18:48:03 EDT 2007
+BIOS-provided physical RAM map:
+ BIOS-e820: 0000000000000000 - 000000000009f000 (usable)

The diff header clearly shows that file descriptors are used as the underlying mechanism.

Embedding fonts in a PDF document

It is often a good idea (or a requirement) to embed the used font faces in a PDF document. This is easily accomplished using ps2pdf during the final stage of conversion of a document from PS to PDF:

$ ps2pdf -sPAPERSIZE=a4 -dPDFSETTINGS=/printer -dCompatibilityLevel=1.3 \
-dMaxSubsetPct=100 -dSubsetFonts=true -dEmbedAllFonts=true \
'' 'output_file.pdf'

An explanation of the command options can be found in the Ps2pdf.htm file in the Ghostscript documentations (or here).


Friday, June 06, 2008

Re-encoding MP3 Files using LAME

I have some MP3 files encoded at a constant bitrate of 320kbps that my phone seems to have trouble playing smoothly. So, I looked into LAME.

The files I had were named using the following scheme:

01 - Title of track 01.mp3
02 - Title of track 02.mp3

I used the BASH for-loop construct to process the files:

$ for A in *.mp3;\ # Process one mp3 at a time
do B=${A%.mp3};\ # Extract track number and title
C=${B#?? -};\ # Extract the title
D=${B%% - *};\ # Extract the track number
lame --vbr-new -V0 -q0\ # Variable-bitrate, high-quality
--mp3input\ # Inputs are MP3 files
--tt "$C"\ # ID3v2 tags: title
--ta 'Artist Name'\ # ID3v2 tags: artist
--tl 'Album Title'\ # ID3v2 tags: album
--ty 2007\ # ID3v2 tags: year
--tn "$D"\ # ID3v2 tags: track no.
--tg 'GENRE'\ # ID3v2 tags: genre
"$A" processed/"$A";\ # Keep filename and save in ./processed/

Since no bit-rate bounds are explicitly provided, the re-encoded files can contain anything between 32kbps and 320kbps. The LAME man-page provides an extensive list of options and their meanings.

Wednesday, March 26, 2008

Processing files using 'find'

In its most basic form, find is often used to locate files that are subsequently piped through a complex set of commands for processing. However, this particular method is easily broken by files that contain spaces in their names.

This is where the 'exec' option provided by find comes in handy. From the man-page:

-exec command ;
Execute command; true if 0 status is returned. All following
arguments to find are taken to be arguments to the command until
an argument consisting of ‘;’ is encountered. The string ‘{}’
is replaced by the current file name being processed everywhere
it occurs in the arguments to the command, not just in arguments
where it is alone, as in some versions of find. Both of these
constructions might need to be escaped (with a ‘\’) or quoted to
protect them from expansion by the shell. See the EXAMPLES sec-
tion for examples of the use of the ‘-exec’ option. The speci-
fied command is run once for each matched file. The command is
executed in the starting directory. There are unavoidable
security problems surrounding use of the -exec option; you
should use the -execdir option instead.

An example that recursively removes all *.doc files from the current directory would be:

$ find . -name \*.doc -exec rm {} \;

Monday, December 03, 2007

Saving Power with Linux

An interesting site with numerous tips and tricks on power efficient computing using Linux:


It is also home to the rather useful "PowerTOP" tool. If the testimonials are anything to go by, everyone running a recent release of Linux should give this a try.

Saturday, December 01, 2007

Embedded multimedia in LateX/Prosper

The movie15 package by Alexander Grahn is useful for this purpose. The movies embedded, however, cannot be viewed with any PDF reader on Linux.

Extracting Audio/Video

It's really easy to extract either audio or video from a multimedia file using 'ffmpeg'. To extract audio only:

$ ffmpeg -i inputfile -vn -acodec copy outputfile

And for video only, replace '-vn' with '-an' and '-acodec' with '-vcodec'.

ffmpeg is also commonly used as a transcoding tool.