blob: 45be0e570bbc4322b90ac918a43198cb5f429008 [file] [log] [blame]
Georg Brandl116aa622007-08-15 14:28:22 +00001:mod:`shutil` --- High-level file operations
2============================================
3
4.. module:: shutil
5 :synopsis: High-level file operations, including copying.
6.. sectionauthor:: Fred L. Drake, Jr. <fdrake@acm.org>
Christian Heimes5b5e81c2007-12-31 16:14:33 +00007.. partly based on the docstrings
Georg Brandl116aa622007-08-15 14:28:22 +00008
9.. index::
10 single: file; copying
11 single: copying files
12
Raymond Hettinger10480942011-01-10 03:26:08 +000013**Source code:** :source:`Lib/shutil.py`
14
Raymond Hettinger4f707fd2011-01-10 19:54:11 +000015--------------
16
Georg Brandl116aa622007-08-15 14:28:22 +000017The :mod:`shutil` module offers a number of high-level operations on files and
18collections of files. In particular, functions are provided which support file
Guido van Rossum2cc30da2007-11-02 23:46:40 +000019copying and removal. For operations on individual files, see also the
20:mod:`os` module.
Georg Brandl116aa622007-08-15 14:28:22 +000021
Guido van Rossumda27fd22007-08-17 00:24:54 +000022.. warning::
Christian Heimes7f044312008-01-06 17:05:40 +000023
24 Even the higher-level file copying functions (:func:`copy`, :func:`copy2`)
Raymond Hettinger10480942011-01-10 03:26:08 +000025 cannot copy all file metadata.
Georg Brandl48310cd2009-01-03 21:18:54 +000026
Christian Heimes7f044312008-01-06 17:05:40 +000027 On POSIX platforms, this means that file owner and group are lost as well
Georg Brandlc575c902008-09-13 17:46:05 +000028 as ACLs. On Mac OS, the resource fork and other metadata are not used.
Christian Heimes7f044312008-01-06 17:05:40 +000029 This means that resources will be lost and file type and creator codes will
30 not be correct. On Windows, file owners, ACLs and alternate data streams
31 are not copied.
Georg Brandl116aa622007-08-15 14:28:22 +000032
Éric Araujo6e6cb8e2010-11-16 19:13:50 +000033
Tarek Ziadé396fad72010-02-23 05:30:31 +000034Directory and files operations
35------------------------------
Georg Brandl116aa622007-08-15 14:28:22 +000036
Georg Brandl116aa622007-08-15 14:28:22 +000037.. function:: copyfileobj(fsrc, fdst[, length])
38
39 Copy the contents of the file-like object *fsrc* to the file-like object *fdst*.
40 The integer *length*, if given, is the buffer size. In particular, a negative
41 *length* value means to copy the data without looping over the source data in
42 chunks; by default the data is read in chunks to avoid uncontrolled memory
43 consumption. Note that if the current file position of the *fsrc* object is not
44 0, only the contents from the current file position to the end of the file will
45 be copied.
46
47
Antoine Pitrou78091e62011-12-29 18:54:15 +010048.. function:: copyfile(src, dst[, symlinks=False])
Christian Heimesa342c012008-04-20 21:01:16 +000049
50 Copy the contents (no metadata) of the file named *src* to a file named *dst*.
51 *dst* must be the complete target file name; look at :func:`copy` for a copy that
Georg Brandlaf265f42008-12-07 15:06:20 +000052 accepts a target directory path. If *src* and *dst* are the same files,
53 :exc:`Error` is raised.
Antoine Pitrou62ab10a2011-10-12 20:10:51 +020054 The destination location must be writable; otherwise, an :exc:`OSError` exception
Christian Heimesa342c012008-04-20 21:01:16 +000055 will be raised. If *dst* already exists, it will be replaced. Special files
56 such as character or block devices and pipes cannot be copied with this
57 function. *src* and *dst* are path names given as strings.
58
Antoine Pitrou78091e62011-12-29 18:54:15 +010059 If *symlinks* is true and *src* is a symbolic link, a new symbolic link will
60 be created instead of copying the file *src* points to.
61
Antoine Pitrou62ab10a2011-10-12 20:10:51 +020062 .. versionchanged:: 3.3
63 :exc:`IOError` used to be raised instead of :exc:`OSError`.
Antoine Pitrou78091e62011-12-29 18:54:15 +010064 Added *symlinks* argument.
Antoine Pitrou62ab10a2011-10-12 20:10:51 +020065
Christian Heimesa342c012008-04-20 21:01:16 +000066
Antoine Pitrou78091e62011-12-29 18:54:15 +010067.. function:: copymode(src, dst[, symlinks=False])
Georg Brandl116aa622007-08-15 14:28:22 +000068
69 Copy the permission bits from *src* to *dst*. The file contents, owner, and
Antoine Pitrou78091e62011-12-29 18:54:15 +010070 group are unaffected. *src* and *dst* are path names given as strings. If
71 *symlinks* is true, *src* a symbolic link and the operating system supports
72 modes for symbolic links (for example BSD-based ones), the mode of the link
73 will be copied.
Georg Brandl116aa622007-08-15 14:28:22 +000074
Antoine Pitrou78091e62011-12-29 18:54:15 +010075 .. versionchanged:: 3.3
76 Added *symlinks* argument.
Georg Brandl116aa622007-08-15 14:28:22 +000077
Antoine Pitrou78091e62011-12-29 18:54:15 +010078.. function:: copystat(src, dst[, symlinks=False])
Georg Brandl116aa622007-08-15 14:28:22 +000079
80 Copy the permission bits, last access time, last modification time, and flags
81 from *src* to *dst*. The file contents, owner, and group are unaffected. *src*
Antoine Pitrou78091e62011-12-29 18:54:15 +010082 and *dst* are path names given as strings. If *src* and *dst* are both
83 symbolic links and *symlinks* true, the stats of the link will be copied as
84 far as the platform allows.
Georg Brandl116aa622007-08-15 14:28:22 +000085
Antoine Pitrou78091e62011-12-29 18:54:15 +010086 .. versionchanged:: 3.3
87 Added *symlinks* argument.
Georg Brandl116aa622007-08-15 14:28:22 +000088
Antoine Pitrou78091e62011-12-29 18:54:15 +010089.. function:: copy(src, dst[, symlinks=False]))
Georg Brandl116aa622007-08-15 14:28:22 +000090
91 Copy the file *src* to the file or directory *dst*. If *dst* is a directory, a
92 file with the same basename as *src* is created (or overwritten) in the
93 directory specified. Permission bits are copied. *src* and *dst* are path
Antoine Pitrou78091e62011-12-29 18:54:15 +010094 names given as strings. If *symlinks* is true, symbolic links won't be
95 followed but recreated instead -- this resembles GNU's :program:`cp -P`.
Georg Brandl116aa622007-08-15 14:28:22 +000096
Antoine Pitrou78091e62011-12-29 18:54:15 +010097 .. versionchanged:: 3.3
98 Added *symlinks* argument.
Georg Brandl116aa622007-08-15 14:28:22 +000099
Antoine Pitrou78091e62011-12-29 18:54:15 +0100100.. function:: copy2(src, dst[, symlinks=False])
Georg Brandl116aa622007-08-15 14:28:22 +0000101
Alexandre Vassalottibee32532008-05-16 18:15:12 +0000102 Similar to :func:`copy`, but metadata is copied as well -- in fact, this is just
103 :func:`copy` followed by :func:`copystat`. This is similar to the
Antoine Pitrou78091e62011-12-29 18:54:15 +0100104 Unix command :program:`cp -p`. If *symlinks* is true, symbolic links won't
105 be followed but recreated instead -- this resembles GNU's :program:`cp -P`.
Georg Brandl116aa622007-08-15 14:28:22 +0000106
Antoine Pitrou78091e62011-12-29 18:54:15 +0100107 .. versionchanged:: 3.3
108 Added *symlinks* argument.
Georg Brandl116aa622007-08-15 14:28:22 +0000109
Georg Brandl86b2fb92008-07-16 03:43:04 +0000110.. function:: ignore_patterns(\*patterns)
111
112 This factory function creates a function that can be used as a callable for
113 :func:`copytree`\'s *ignore* argument, ignoring files and directories that
114 match one of the glob-style *patterns* provided. See the example below.
115
116
Ezio Melotticb999a32010-04-20 11:26:51 +0000117.. function:: copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False)
Georg Brandl116aa622007-08-15 14:28:22 +0000118
119 Recursively copy an entire directory tree rooted at *src*. The destination
Georg Brandl86b2fb92008-07-16 03:43:04 +0000120 directory, named by *dst*, must not already exist; it will be created as well
121 as missing parent directories. Permissions and times of directories are
122 copied with :func:`copystat`, individual files are copied using
123 :func:`copy2`.
Georg Brandl116aa622007-08-15 14:28:22 +0000124
Georg Brandl86b2fb92008-07-16 03:43:04 +0000125 If *symlinks* is true, symbolic links in the source tree are represented as
Antoine Pitrou78091e62011-12-29 18:54:15 +0100126 symbolic links in the new tree and the metadata of the original links will
127 be copied as far as the platform allows; if false or omitted, the contents
128 and metadata of the linked files are copied to the new tree.
Georg Brandl86b2fb92008-07-16 03:43:04 +0000129
Tarek Ziadéfb437512010-04-20 08:57:33 +0000130 When *symlinks* is false, if the file pointed by the symlink doesn't
131 exist, a exception will be added in the list of errors raised in
132 a :exc:`Error` exception at the end of the copy process.
133 You can set the optional *ignore_dangling_symlinks* flag to true if you
Tarek Ziadé8c26c7d2010-04-23 13:03:50 +0000134 want to silence this exception. Notice that this option has no effect
135 on platforms that don't support :func:`os.symlink`.
Tarek Ziadéfb437512010-04-20 08:57:33 +0000136
Georg Brandl86b2fb92008-07-16 03:43:04 +0000137 If *ignore* is given, it must be a callable that will receive as its
138 arguments the directory being visited by :func:`copytree`, and a list of its
139 contents, as returned by :func:`os.listdir`. Since :func:`copytree` is
140 called recursively, the *ignore* callable will be called once for each
141 directory that is copied. The callable must return a sequence of directory
142 and file names relative to the current directory (i.e. a subset of the items
143 in its second argument); these names will then be ignored in the copy
144 process. :func:`ignore_patterns` can be used to create such a callable that
145 ignores names based on glob-style patterns.
146
147 If exception(s) occur, an :exc:`Error` is raised with a list of reasons.
148
Tarek Ziadé5340db32010-04-19 22:30:51 +0000149 If *copy_function* is given, it must be a callable that will be used
150 to copy each file. It will be called with the source path and the
151 destination path as arguments. By default, :func:`copy2` is used, but any
152 function that supports the same signature (like :func:`copy`) can be used.
Georg Brandl116aa622007-08-15 14:28:22 +0000153
Tarek Ziadé5340db32010-04-19 22:30:51 +0000154 .. versionchanged:: 3.2
155 Added the *copy_function* argument to be able to provide a custom copy
156 function.
Georg Brandl116aa622007-08-15 14:28:22 +0000157
Ezio Melotticb999a32010-04-20 11:26:51 +0000158 .. versionchanged:: 3.2
Tarek Ziadéfb437512010-04-20 08:57:33 +0000159 Added the *ignore_dangling_symlinks* argument to silent dangling symlinks
160 errors when *symlinks* is false.
161
Antoine Pitrou78091e62011-12-29 18:54:15 +0100162 .. versionchanged:: 3.3
163 Copy metadata when *symlinks* is false.
164
Tarek Ziadéfb437512010-04-20 08:57:33 +0000165
Georg Brandl18244152009-09-02 20:34:52 +0000166.. function:: rmtree(path, ignore_errors=False, onerror=None)
Georg Brandl116aa622007-08-15 14:28:22 +0000167
168 .. index:: single: directory; deleting
169
Christian Heimes9bd667a2008-01-20 15:14:11 +0000170 Delete an entire directory tree; *path* must point to a directory (but not a
171 symbolic link to a directory). If *ignore_errors* is true, errors resulting
172 from failed removals will be ignored; if false or omitted, such errors are
173 handled by calling a handler specified by *onerror* or, if that is omitted,
174 they raise an exception.
Georg Brandl116aa622007-08-15 14:28:22 +0000175
Christian Heimes9bd667a2008-01-20 15:14:11 +0000176 If *onerror* is provided, it must be a callable that accepts three
177 parameters: *function*, *path*, and *excinfo*. The first parameter,
178 *function*, is the function which raised the exception; it will be
179 :func:`os.path.islink`, :func:`os.listdir`, :func:`os.remove` or
180 :func:`os.rmdir`. The second parameter, *path*, will be the path name passed
181 to *function*. The third parameter, *excinfo*, will be the exception
182 information return by :func:`sys.exc_info`. Exceptions raised by *onerror*
183 will not be caught.
184
Georg Brandl116aa622007-08-15 14:28:22 +0000185
186.. function:: move(src, dst)
187
Éric Araujo14382dc2011-07-28 22:49:11 +0200188 Recursively move a file or directory (*src*) to another location (*dst*).
Georg Brandl116aa622007-08-15 14:28:22 +0000189
Éric Araujo14382dc2011-07-28 22:49:11 +0200190 If the destination is a directory or a symlink to a directory, then *src* is
191 moved inside that directory.
192
193 The destination directory must not already exist. If the destination already
194 exists but is not a directory, it may be overwritten depending on
195 :func:`os.rename` semantics.
196
197 If the destination is on the current filesystem, then :func:`os.rename` is
198 used. Otherwise, *src* is copied (using :func:`copy2`) to *dst* and then
199 removed.
Georg Brandl116aa622007-08-15 14:28:22 +0000200
Giampaolo Rodola'210e7ca2011-07-01 13:55:36 +0200201.. function:: disk_usage(path)
202
Éric Araujoe4d5b8e2011-08-08 16:51:11 +0200203 Return disk usage statistics about the given path as a :term:`named tuple`
204 with the attributes *total*, *used* and *free*, which are the amount of
205 total, used and free space, in bytes.
Giampaolo Rodola'210e7ca2011-07-01 13:55:36 +0200206
207 .. versionadded:: 3.3
208
209 Availability: Unix, Windows.
Georg Brandl116aa622007-08-15 14:28:22 +0000210
Sandro Tosid902a142011-08-22 23:28:27 +0200211.. function:: chown(path, user=None, group=None)
212
213 Change owner *user* and/or *group* of the given *path*.
214
215 *user* can be a system user name or a uid; the same applies to *group*. At
216 least one argument is required.
217
218 See also :func:`os.chown`, the underlying function.
219
220 Availability: Unix.
221
222 .. versionadded:: 3.3
223
224
Georg Brandl116aa622007-08-15 14:28:22 +0000225.. exception:: Error
226
Éric Araujo14382dc2011-07-28 22:49:11 +0200227 This exception collects exceptions that are raised during a multi-file
228 operation. For :func:`copytree`, the exception argument is a list of 3-tuples
229 (*srcname*, *dstname*, *exception*).
Georg Brandl116aa622007-08-15 14:28:22 +0000230
Georg Brandl116aa622007-08-15 14:28:22 +0000231
232.. _shutil-example:
233
Tarek Ziadé396fad72010-02-23 05:30:31 +0000234copytree example
235::::::::::::::::
Georg Brandl116aa622007-08-15 14:28:22 +0000236
237This example is the implementation of the :func:`copytree` function, described
238above, with the docstring omitted. It demonstrates many of the other functions
239provided by this module. ::
240
241 def copytree(src, dst, symlinks=False):
242 names = os.listdir(src)
243 os.makedirs(dst)
244 errors = []
245 for name in names:
246 srcname = os.path.join(src, name)
247 dstname = os.path.join(dst, name)
248 try:
249 if symlinks and os.path.islink(srcname):
250 linkto = os.readlink(srcname)
251 os.symlink(linkto, dstname)
252 elif os.path.isdir(srcname):
253 copytree(srcname, dstname, symlinks)
254 else:
255 copy2(srcname, dstname)
256 # XXX What about devices, sockets etc.?
257 except (IOError, os.error) as why:
258 errors.append((srcname, dstname, str(why)))
259 # catch the Error from the recursive copytree so that we can
260 # continue with other files
261 except Error as err:
262 errors.extend(err.args[0])
263 try:
264 copystat(src, dst)
265 except WindowsError:
266 # can't copy file access times on Windows
267 pass
268 except OSError as why:
269 errors.extend((src, dst, str(why)))
270 if errors:
Collin Winterc79461b2007-09-01 23:34:30 +0000271 raise Error(errors)
Georg Brandl116aa622007-08-15 14:28:22 +0000272
Tarek Ziadé396fad72010-02-23 05:30:31 +0000273Another example that uses the :func:`ignore_patterns` helper::
274
275 from shutil import copytree, ignore_patterns
276
277 copytree(source, destination, ignore=ignore_patterns('*.pyc', 'tmp*'))
278
279This will copy everything except ``.pyc`` files and files or directories whose
280name starts with ``tmp``.
281
282Another example that uses the *ignore* argument to add a logging call::
283
284 from shutil import copytree
285 import logging
286
287 def _logpath(path, names):
288 logging.info('Working in %s' % path)
289 return [] # nothing will be ignored
290
291 copytree(source, destination, ignore=_logpath)
292
293
Raymond Hettinger0929b1f2011-01-23 11:29:08 +0000294.. _archiving-operations:
295
296Archiving operations
297--------------------
Tarek Ziadé396fad72010-02-23 05:30:31 +0000298
299.. function:: make_archive(base_name, format, [root_dir, [base_dir, [verbose, [dry_run, [owner, [group, [logger]]]]]]])
300
Raymond Hettinger0929b1f2011-01-23 11:29:08 +0000301 Create an archive file (such as zip or tar) and return its name.
Tarek Ziadé396fad72010-02-23 05:30:31 +0000302
303 *base_name* is the name of the file to create, including the path, minus
304 any format-specific extension. *format* is the archive format: one of
Tarek Ziadéffa155a2010-04-29 13:34:35 +0000305 "zip", "tar", "bztar" (if the :mod:`bz2` module is available) or "gztar".
Tarek Ziadé396fad72010-02-23 05:30:31 +0000306
307 *root_dir* is a directory that will be the root directory of the
Raymond Hettinger0929b1f2011-01-23 11:29:08 +0000308 archive; for example, we typically chdir into *root_dir* before creating the
Tarek Ziadé396fad72010-02-23 05:30:31 +0000309 archive.
310
311 *base_dir* is the directory where we start archiving from;
Ezio Melotticb999a32010-04-20 11:26:51 +0000312 i.e. *base_dir* will be the common prefix of all files and
Tarek Ziadé396fad72010-02-23 05:30:31 +0000313 directories in the archive.
314
315 *root_dir* and *base_dir* both default to the current directory.
316
317 *owner* and *group* are used when creating a tar archive. By default,
318 uses the current owner and group.
319
Éric Araujo06c42a32011-11-07 17:31:07 +0100320 *logger* must be an object compatible with :pep:`282`, usually an instance of
321 :class:`logging.Logger`.
Raymond Hettinger0929b1f2011-01-23 11:29:08 +0000322
Ezio Melottif8754a62010-03-21 07:16:43 +0000323 .. versionadded:: 3.2
Tarek Ziadé396fad72010-02-23 05:30:31 +0000324
325
326.. function:: get_archive_formats()
327
Éric Araujo14382dc2011-07-28 22:49:11 +0200328 Return a list of supported formats for archiving.
Tarek Ziadé396fad72010-02-23 05:30:31 +0000329 Each element of the returned sequence is a tuple ``(name, description)``
330
331 By default :mod:`shutil` provides these formats:
332
333 - *gztar*: gzip'ed tar-file
Tarek Ziadéffa155a2010-04-29 13:34:35 +0000334 - *bztar*: bzip2'ed tar-file (if the :mod:`bz2` module is available.)
Tarek Ziadé396fad72010-02-23 05:30:31 +0000335 - *tar*: uncompressed tar file
336 - *zip*: ZIP file
337
338 You can register new formats or provide your own archiver for any existing
339 formats, by using :func:`register_archive_format`.
340
Ezio Melottif8754a62010-03-21 07:16:43 +0000341 .. versionadded:: 3.2
Tarek Ziadé396fad72010-02-23 05:30:31 +0000342
343
344.. function:: register_archive_format(name, function, [extra_args, [description]])
345
Éric Araujo14382dc2011-07-28 22:49:11 +0200346 Register an archiver for the format *name*. *function* is a callable that
Tarek Ziadé396fad72010-02-23 05:30:31 +0000347 will be used to invoke the archiver.
348
Raymond Hettinger0929b1f2011-01-23 11:29:08 +0000349 If given, *extra_args* is a sequence of ``(name, value)`` pairs that will be
Tarek Ziadé396fad72010-02-23 05:30:31 +0000350 used as extra keywords arguments when the archiver callable is used.
351
352 *description* is used by :func:`get_archive_formats` which returns the
353 list of archivers. Defaults to an empty list.
354
Ezio Melottif8754a62010-03-21 07:16:43 +0000355 .. versionadded:: 3.2
Tarek Ziadé396fad72010-02-23 05:30:31 +0000356
357
Tarek Ziadé6ac91722010-04-28 17:51:36 +0000358.. function:: unregister_archive_format(name)
Tarek Ziadé396fad72010-02-23 05:30:31 +0000359
360 Remove the archive format *name* from the list of supported formats.
361
Ezio Melottif8754a62010-03-21 07:16:43 +0000362 .. versionadded:: 3.2
Tarek Ziadé396fad72010-02-23 05:30:31 +0000363
364
Tarek Ziadé6ac91722010-04-28 17:51:36 +0000365.. function:: unpack_archive(filename[, extract_dir[, format]])
366
367 Unpack an archive. *filename* is the full path of the archive.
368
369 *extract_dir* is the name of the target directory where the archive is
370 unpacked. If not provided, the current working directory is used.
371
372 *format* is the archive format: one of "zip", "tar", or "gztar". Or any
373 other format registered with :func:`register_unpack_format`. If not
374 provided, :func:`unpack_archive` will use the archive file name extension
375 and see if an unpacker was registered for that extension. In case none is
376 found, a :exc:`ValueError` is raised.
377
378 .. versionadded:: 3.2
379
380
Raymond Hettinger0929b1f2011-01-23 11:29:08 +0000381.. function:: register_unpack_format(name, extensions, function[, extra_args[, description]])
Tarek Ziadé6ac91722010-04-28 17:51:36 +0000382
383 Registers an unpack format. *name* is the name of the format and
384 *extensions* is a list of extensions corresponding to the format, like
385 ``.zip`` for Zip files.
386
387 *function* is the callable that will be used to unpack archives. The
388 callable will receive the path of the archive, followed by the directory
389 the archive must be extracted to.
390
391 When provided, *extra_args* is a sequence of ``(name, value)`` tuples that
392 will be passed as keywords arguments to the callable.
393
394 *description* can be provided to describe the format, and will be returned
395 by the :func:`get_unpack_formats` function.
396
397 .. versionadded:: 3.2
398
399
400.. function:: unregister_unpack_format(name)
401
402 Unregister an unpack format. *name* is the name of the format.
403
404 .. versionadded:: 3.2
405
406
407.. function:: get_unpack_formats()
408
409 Return a list of all registered formats for unpacking.
410 Each element of the returned sequence is a tuple
411 ``(name, extensions, description)``.
412
413 By default :mod:`shutil` provides these formats:
414
415 - *gztar*: gzip'ed tar-file
Tarek Ziadéffa155a2010-04-29 13:34:35 +0000416 - *bztar*: bzip2'ed tar-file (if the :mod:`bz2` module is available.)
Tarek Ziadé6ac91722010-04-28 17:51:36 +0000417 - *tar*: uncompressed tar file
418 - *zip*: ZIP file
419
420 You can register new formats or provide your own unpacker for any existing
421 formats, by using :func:`register_unpack_format`.
422
423 .. versionadded:: 3.2
424
425
426
Tarek Ziadé396fad72010-02-23 05:30:31 +0000427Archiving example
428:::::::::::::::::
429
430In this example, we create a gzip'ed tar-file archive containing all files
431found in the :file:`.ssh` directory of the user::
432
433 >>> from shutil import make_archive
434 >>> import os
435 >>> archive_name = os.path.expanduser(os.path.join('~', 'myarchive'))
436 >>> root_dir = os.path.expanduser(os.path.join('~', '.ssh'))
437 >>> make_archive(archive_name, 'gztar', root_dir)
438 '/Users/tarek/myarchive.tar.gz'
439
440The resulting archive contains::
441
442 $ tar -tzvf /Users/tarek/myarchive.tar.gz
443 drwx------ tarek/staff 0 2010-02-01 16:23:40 ./
444 -rw-r--r-- tarek/staff 609 2008-06-09 13:26:54 ./authorized_keys
445 -rwxr-xr-x tarek/staff 65 2008-06-09 13:26:54 ./config
446 -rwx------ tarek/staff 668 2008-06-09 13:26:54 ./id_dsa
447 -rwxr-xr-x tarek/staff 609 2008-06-09 13:26:54 ./id_dsa.pub
448 -rw------- tarek/staff 1675 2008-06-09 13:26:54 ./id_rsa
449 -rw-r--r-- tarek/staff 397 2008-06-09 13:26:54 ./id_rsa.pub
450 -rw-r--r-- tarek/staff 37192 2010-02-06 18:23:10 ./known_hosts
451
452