2017-09-23 06:27:51 +02:00
|
|
|
dirpacker.py
|
|
|
|
============
|
|
|
|
|
|
|
|
This scripts allows you to group (pack) a bunch of files or directories into
|
|
|
|
fixed-size volumes, optimizing the occupied size of the volumes. The original
|
|
|
|
use case was to burn MP3 albums to CD-ROMs to play them in the car, while
|
|
|
|
minimizing the amount of wasted space on each disc. Of course, it can be used
|
|
|
|
to backup any kind of files to any kind of medium.
|
|
|
|
|
|
|
|
The particularity of this program, compared for example to datapacker (from
|
|
|
|
which it is loosely inspired) is that it works with directories instead of
|
|
|
|
regular files only. The files inside a directory won't be separated on several
|
|
|
|
archives, they will be on the same volume.
|
|
|
|
|
|
|
|
Note: I kept the datapacker's terminology in which a volume is also called a
|
|
|
|
bin.
|
|
|
|
|
|
|
|
The default bin size is 703 MiB, i.e. the capacity of a 80-minute CD-ROM; note
|
|
|
|
that this can lead to slightly exceed the capacity when actually burning the
|
|
|
|
disc, so if you don't want to overburn a few hundreds KiB, choose a lower bin
|
|
|
|
size (702 MiB should be fine).
|
|
|
|
|
|
|
|
By default, dirpacker displays a list of bins and the files they would contain,
|
|
|
|
along with the size of each file and some statistics. With the option
|
|
|
|
`--machine-readable`, this list will be printed in a machine-readable format:
|
|
|
|
each line contains a bin's name, then a tabulation, then a file that belongs to
|
|
|
|
this bin.
|
|
|
|
|
|
|
|
With the option `--move`, a directory will be created for each volume and the
|
|
|
|
files will be moved to the corresponding volume.
|
|
|
|
|
|
|
|
To see the full usage, call the program with `-h`.
|
|
|
|
|
|
|
|
|
|
|
|
mvparent.sh
|
|
|
|
===========
|
|
|
|
|
|
|
|
`mvparent.sh` was originally written to be integrated in the ROX-Filer
|
|
|
|
directory “Send to” menu. It moves the contents of a directory into its parent
|
|
|
|
directory, then deletes the empty directory.
|
|
|
|
|
|
|
|
To install this script, just copy it in a directory which is in your `PATH`, or
|
|
|
|
use the `bin` directory provided with the repository, as explained in the main
|
|
|
|
`README.md`.
|
|
|
|
|
|
|
|
If you want to integrate it in ROX-Filer:
|
|
|
|
|
|
|
|
mkdir -p ~/.config/rox.sourceforge.net/SendTo/.inode_directory
|
|
|
|
cp mvparent.sh ~/.config/rox.sourceforge.net/SendTo/.inode_directory/"Move here"
|
|
|
|
|
|
|
|
|
2018-04-11 20:55:01 +02:00
|
|
|
prefixsubdirs.sh
|
|
|
|
================
|
|
|
|
|
|
|
|
The use case for this script is to flatten a file hierarchy, for instance
|
|
|
|
switching from:
|
|
|
|
|
|
|
|
dir1
|
|
|
|
|-- dirA
|
|
|
|
|-- dirB
|
|
|
|
`-- dirC
|
|
|
|
|
|
|
|
to:
|
|
|
|
|
|
|
|
dir1 ; dirA
|
|
|
|
dir1 ; dirB
|
|
|
|
dir1 ; dirC
|
|
|
|
|
|
|
|
However, `prefixsubdirs.sh` will only rename the subdirectories (not the
|
|
|
|
regular files) within the given directories, it will not actually flatten the
|
|
|
|
hierarchy. You can use `mvparent.sh` for this purpose (see above).
|
|
|
|
|
|
|
|
|
2017-09-23 06:27:51 +02:00
|
|
|
unln.py
|
|
|
|
=======
|
|
|
|
|
|
|
|
I wrote this script after accidentally merging all my “duplicate” files with
|
|
|
|
the cleaning tool `fslint` (thanks guys for a totally confusing UI!). It does
|
|
|
|
the opposite of the `ln` command, that is it separates file names given as
|
|
|
|
arguments from their respective inodes by doing the equivalent of `cp -p file
|
|
|
|
tmp && mv tmp file`. Checks are done in order to work only on regular files
|
|
|
|
that have more than one hard link, so the minimal amount of copies are done.
|
|
|
|
|
|
|
|
A summary of the file names on which errors were raised is displayed at the end
|
|
|
|
of the execution. Note that if a file is under a directory which is not
|
|
|
|
executable (i.e. the program can't `cd` in), it will be considered as
|
|
|
|
non-existent and ignored, and its name won't be displayed.
|
|
|
|
|
|
|
|
/!\ **Warning #1**: the Python copy function used is `shutil.copy2()`, which
|
|
|
|
tries to preserve all the metadata it can, but as of Python 3.3 it is not
|
|
|
|
guaranteed that extended attributes will be preserved. See the documentation
|
|
|
|
for details: <http://docs.python.org/3/library/shutil.html>.
|
|
|
|
|
|
|
|
/!\ **Warning #2**: file owner and group cannot be preserved, as a file is
|
|
|
|
always created (upon copy, in our case) with the current user's UID and GID.
|
|
|
|
|
|
|
|
**Tip**: if you have a file listing all the file names you want to work on,
|
|
|
|
with one name per line, you can use `xargs` with `--delimiter='\n'`:
|
|
|
|
|
|
|
|
xargs --delimiter='\n' <list.txt unln.py
|
|
|
|
|
|
|
|
(Without this option, you would have troubles with file names containing
|
|
|
|
spaces.)
|