Dateien sortieren: xdg-dir-sort
Ein BASH Skript das Dateien anhand des MIME-Type sortiert und in die xdg-user-dirs Verz. verschiebt.
Usage: xdg-storage <PATH>...
Dem Skript muss als Argument mindestens ein Pfad übergeben werden (folgend als PATH bezeichnet), der sortiert werden sollen. Das kann ein Verzeichnis oder eine Datei sein. Es können auch mehrere Pfade übergeben werden.
Ist das Verz. $HOME/Storage vorhanden, werden die Dateien (PATH) in dieses Verz. sortiert und dazu in die Unterverz. $HOME/Storage/type/subtype verschoben. Über die Konfigurationsvariable XDG_STORAGE_DIR, kann auch ein anderes Verz. angegeben werden (s. u.).
Doppelten Dateinamen wird ein Zähler angefügt. Siehe dazu auch die Option --backup=numbered von mv.
Noch ist XDG_STORAGE_DIR, wie auch XDG_PROJECTS_DIR kein Teil von xdg-user-dirs ...
Konfiguration
Die Konfiguration ist ein POSIX Shell-Script Fragment. Pfad: XDG_CONFIG_HOME/xdg-storage.
XDG_STORAGE_DIR
XDG_STORAGE_DIR=$HOME/Storage # Default
Dateien werden ins Unterverz. XDG_STORAGE_DIR/type/subtype verschoben.
Existiert das Verz. XDG_STORAGE_DIR nicht, werden Dateien entsprechend in die xdg-user-dirs Verz. verschoben.
Wobei gilt:
- Type text/* nach XDG_DOCUMENTS_DIR/type/subtype
- Type image/* nach XDG_PICTURES_DIR/type/subtype
- Type audio/* nach XDG_MUSIC_DIR/type/subtype
- Type video/* nach XDG_VIDEOS_DIR/type/subtype
Alle anderen Typen nach $HOME/type/subtype.
Ist xdg-user-dirs nicht installiert, wird auch nach $HOME/type/subtype verschoben.
Das Skript
#!/bin/bash
# xdg-storage (BASH script)
# Copyleft Inne <inne@sdf-eu.org>; GPL lizensiert.
# Die xdg-user-dirs Definitionen einlesen
if test -f "${XDG_CONFIG_HOME:-$HOME/.config}/user-dirs.dirs"; then
source "${XDG_CONFIG_HOME:-$HOME/.config}/user-dirs.dirs"
fi
# Standardpfade für fehlende xdg-user-dirs setzen
XDG_DOWNLOAD_DIR="${XDG_DOWNLOAD_DIR:-$HOME/Downloads}"
XDG_DOCUMENTS_DIR="${XDG_DOCUMENTS_DIR:-$HOME}"
XDG_PICTURES_DIR="${XDG_PICTURES_DIR:-$HOME}"
XDG_MUSIC_DIR="${XDG_MUSIC_DIR:-$HOME}"
XDG_VIDEOS_DIR="${XDG_VIDEOS_DIR:-$HOME}"
# Optionen einlesen
if test -f "${XDG_CONFIG_HOME:-$HOME/.config}/xdg-storage"; then
source "${XDG_CONFIG_HOME:-$HOME/.config}/xdg-storage"
fi
# Standardwerte für nicht gesetzte Optionen setzen
XDG_STORAGE_DIR="${XDG_STORAGE_DIR:-$HOME/Storage}"
#
# Fnk. die anhand des MIME-Type und xdg-user-dirs,
# das zu verwendene Verz. auf STDOUT zurück gibt.
#
get_xdg_user_dir() {
case "$*" in
audio/*)
echo "$XDG_MUSIC_DIR/$*"
;;
image/*)
echo "$XDG_PICTURES_DIR/$*"
;;
text/*)
echo "$XDG_DOCUMENTS_DIR/$*"
;;
video/*)
echo "$XDG_VIDEOS_DIR/$*"
;;
application/*|chemical/*|*)
echo "$HOME/$*"
;;
esac
}
for path; do
# Existiert die angegebene Dat.
if ! test -e "$path"; then
continue
fi
# Wurde ein Verz. angegebene, dann rekursiv abarbeiten
if test -d "$path"; then
cd "$path"
$0 *
continue
fi
mime_type="$(file -b --mime-type "$path")"
dir=
# Verz. bestimmen in das die Datei einsortiert werden soll
if test -d "$XDG_STORAGE_DIR"; then
dir="$XDG_STORAGE_DIR/$mime_type"
else
dir=$(get_xdg_user_dir "$mime_type")
fi
# Ist die Dat. schon einsortiert?
if test "./$dir/$(basename "$path")" = "$path"; then
continue
fi
# Dat. ins Verz. verschieben
mkdir -p "$dir"
mv -v --backup=numbered "$path" "$dir"
done
FAQ/Troubleshooting
Hier noch Antworten auf Fragen zum Skript und einige Anmerkungen zu Punkten, die (noch) nicht direkt ins Skript übernommen werden sollen bzw. gelöst/umgesetzt sind.
- Wie symbolische Links löschen? Symbolische Links (Verknüpfungen) werden nicht einsortiert, wenn das Ziel schon sortiert ist und verbleiben. Mit
find <DIR> -type l -delete
, können solche Verknüpfungen gelöscht werden.
- Wie ein Netzlaufwerk für XDG_STORAGE_DIR angeben? Noch kann für XDG_STORAGE_DIR kein Netzlaufwerk (NAS) angegeben werden. Dies kann aber mit den Tools aus gvfs-bin (gvfs-mkdir, gvfs-move usw.) umgesetzt werden.
Siehe auch
Identifizierung von Dateien mit file/libmagic
Ein Vortrag von Christoph Biedl auf der GPN14
Der Vortrag stellt das UNIX-Programm file vor, das auch von xdg-sort-dir genutzt wird, zur Erkennung des MIME-Typs einer Datei.