diff --git a/hadoop-tools.cabal b/hadoop-tools.cabal
--- a/hadoop-tools.cabal
+++ b/hadoop-tools.cabal
@@ -1,7 +1,29 @@
 name:          hadoop-tools
-version:       0.4
-synopsis:      Fast command line tools for working with Hadoop.
-description:   Fast command line tools for working with Hadoop.
+version:       0.4.0.1
+
+synopsis:
+  Fast command line tools for working with Hadoop.
+
+description:
+  hh - Blazing fast interaction with HDFS
+  .
+  Currently we only support v7 of the RPC protocol (< CDH5).
+  .
+  Support for v9 (>= CDH5) is coming soon.
+  .
+  > hh cat     - Print the contents of a file to stdout
+  > hh cd      - Change working directory
+  > hh chmod   - Change permissions
+  > hh du      - Show the amount of space used by file or directory
+  > hh find    - Recursively search a directory tree
+  > hh get     - Get a file
+  > hh ls      - List the contents of a directory
+  > hh mkdir   - Create a directory in the specified location
+  > hh pwd     - Print working directory
+  > hh rm      - Delete a file or directory
+  > hh mv      - Rename a file or directory
+  > hh version - Show version information
+
 homepage:      http://github.com/jystic/hadoop-tools
 license:       Apache-2.0
 license-file:  LICENSE
@@ -21,6 +43,7 @@
   ghc-prof-options: -auto-all -caf-all
 
   other-modules:
+    Glob
     Paths_hadoop_tools
 
   build-depends:
@@ -31,7 +54,7 @@
     , configurator         >= 0.3
     , exceptions           >= 0.6
     , filepath             >= 1.3
-    , hadoop-rpc           >= 0.1
+    , hadoop-rpc           >= 0.1.1.1
     , old-locale           >= 1.0
     , optparse-applicative >= 0.10
     , protobuf             >= 0.2.0.4
diff --git a/src/Glob.hs b/src/Glob.hs
new file mode 100644
--- /dev/null
+++ b/src/Glob.hs
@@ -0,0 +1,57 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Glob
+    ( Glob
+    , compile
+    , matches
+    ) where
+
+------------------------------------------------------------------------
+
+import           Control.Applicative ((<$>))
+import           Data.ByteString (ByteString)
+import qualified Data.ByteString.Char8 as B
+import           Data.Monoid ((<>))
+import           System.IO.Unsafe (unsafeDupablePerformIO)
+import qualified Text.Regex.PCRE.ByteString as Regex
+
+------------------------------------------------------------------------
+
+newtype Glob = Glob { unGlob :: Regex.Regex }
+
+compile :: ByteString -> IO Glob
+compile = (glob <$>) . Regex.compile Regex.compBlank Regex.execBlank . globToRegex
+  where
+    glob (Left (_, str)) = error str
+    glob (Right regex)   = Glob regex
+
+matches :: Glob -> ByteString -> Bool
+matches g = fromResult . unsafeDupablePerformIO . Regex.execute (unGlob g)
+  where
+    fromResult (Right (Just _)) = True
+    fromResult _                = False
+
+------------------------------------------------------------------------
+-- Stolen from Real World Haskell
+
+globToRegex :: ByteString -> ByteString
+globToRegex bs = B.pack ("^" <> globToRegex' (B.unpack bs) <> "$")
+
+globToRegex' :: String -> String
+globToRegex' ""             = ""
+globToRegex' ('*':cs)       = ".*" ++ globToRegex' cs
+globToRegex' ('?':cs)       = '.' : globToRegex' cs
+globToRegex' ('[':'!':c:cs) = "[^" ++ c : charClass cs
+globToRegex' ('[':c:cs)     = '['  :  c : charClass cs
+globToRegex' ('[':_)        = error "unterminated character class"
+globToRegex' (c:cs)         = escape c ++ globToRegex' cs
+
+escape :: Char -> String
+escape c | c `elem` regexChars = '\\' : [c]
+         | otherwise = [c]
+    where regexChars = "\\+()^$.{}]|"
+
+charClass :: String -> String
+charClass (']':cs) = ']' : globToRegex' cs
+charClass (c:cs)   = c : charClass cs
+charClass []       = error "unterminated character class"
