
.. automodule:: selkie.cld.seal.sh

File system convenience functions — ``selkie.cld.seal.sh``
==========================================================

Creating directories
--------------------

``mkdir`` is imported from ``os``.  ``mkdirp`` is equivalent to
``mkdir -p``::

   >>> from selkie.cld.seal.sh import mkdirp
   >>> mkdirp('/tmp/foo')

The function ``need_parent`` can be used to assure that the parent
directory exists for a filename.  For example::

   >>> from selkie.cld.seal.sh import need_parent
   >>> need_parent('/tmp/foo/myfile')

is the same as ``mkdirp /tmp/foo``.

Navigation
----------

Examples::

   >>> from selkie.cld.seal.sh import pwd, cd, ls, lsl
   >>> cd('/tmp/foo')
   >>> ls()
   bar     baz     greet   text
   >>> pwd()
   '/private/tmp/foo'
   >>> lsl()
   total 16
   -rw-r--r--  1 spa  wheel  4 Oct 14 17:35 bar
   -rw-r--r--  1 spa  wheel  8 Oct 14 17:41 baz

The variations ``lsd``, ``lsld``, and ``lslt`` are also available.

with Cwd()
----------

.. py:class:: selkie.cld.seal.sh.Cwd

   The ``Cwd`` class protects against changes in working directory.
   On exit, it restores the working directory to what it was on entry::
      
      with Cwd():
          ...


Creating files: ``touch``, ``echo``, ``cat``
--------------------------------------------

One can use ``touch`` to create a new file::

   >>> cd('/tmp/foo')
   >>> touch('bar')

The function ``echo`` takes an optional second argument which is a
filename.  By default, the file is appended to, leaving any previous
contents intact::

   >>> echo('hi', '/tmp/greet')
   >>> echo('lo', '/tmp/greet')
   >>> cat('/tmp/greet')
   hi
   lo

One can prefix the filename with ``>`` or ``>>`` to
explicitly specify overwriting versus appending::

   >>> echo('boo', '>/tmp/bar')
   >>> cat('/tmp/bar')
   boo

The function ``cat`` behaves similarly.  With a single argument, it
prints to stdout, and given multiple arguments, it takes the last as
the output file name.  By default, the output file is created, but one
may specify appending by prefixing the filename with ``>>``::

   >>> cat('/tmp/greet', '/tmp/bar', '/tmp/baz')
   >>> cat('/tmp/baz')
   hi
   lo
   boo
   >>> cat('/tmp/bar', '/tmp/bar', '>1')
   boo
   boo


Examining files: ``more``, ``od``, ``wc``
-----------------------------------------

The function ``cat`` can also be used, of course.  The other
functions (``more``, ``od``, ``wc``) simply use ``os.system()``
to call the Unix executables.  The type of datum for ``od`` can be
specified using the ``type`` keyword.  Possible values are: ``a``
(named characters); ``c``; $is$ where $i$ is one of ``d``,
``o``, ``u``, ``x`` and $s$ (optional) is one of ``C``, ``S``, ``I``,
``L``, or a number of bytes; or ``f`` followed optionally by
``F``, ``D``, or ``L``::

   >>> od('bar')
   0000000    b   o   o  \n                                                
   0000004
   >>> od('bar', 'xC')
   0000000    62  6f  6f  0a                                                
   0000004
   >>> echo('this is a test', 'text')
   >>> echo('it is only a test', 'text')
   >>> wc('text')
          2       9      33 text


Copying: ``cp``, ``cpr``, ``mv``, ``ln``
----------------------------------------

The commands ``cp``, ``mv``, and ``ln`` behave as in the Unix shell.
The command ``cpr`` does a recursive copy.  An error is signalled if
the target already exists.  Symbolic links are copied as symbolic links.
Examples::

   >>> cp('bar', 'bar2')
   >>> ls()
   bar     bar2    baz
   >>> mv('bar2', 'bar3')
   >>> ls()
   bar     bar3    baz
   >>> ln('bar3', 'bar4')
   >>> cat('bar4')
   boo

Note that ``ln`` creates a symbolic link, not a hard link.  To
create a hard link, use ``link``.  (Both are imported from ``os``.
In ``os``, ``ln`` is called ``symlink``.)

Deletion: ``rm``, ``rmrf``, ``rmdir``
-------------------------------------

Examples::

   >>> rm('bar4')
   >>> ls()
   bar     bar3    baz
   >>> cd('..')
   >>> lsd('foo')
   foo
   >>> rmrf('foo')
   >>> lsd('foo')
   ls: foo: No such file or directory

Misc: ``sh``, ``pid``, ``launch``
---------------------------------

The functions ``sh`` and ``pid`` are just synonyms for
``os.system`` and ``os.getpid``.  The function ``launch``
calls the executable ``open``, which is Mac-specific.
