Dateien sortieren: xdg-dir-sort

Aus DebianforumWiki
Zur Navigation springen Zur Suche springen
Wiki ‹ Scripting ‹ Dateien sortieren: xdg-dir-sort


Ein BASH Skript das Dateien anhand des MIME-Type sortiert und in die Debianpackage.png 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 Man-Page.png 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 Debianpackage.png 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 Debianpackage.png file vor, das auch von xdg-sort-dir genutzt wird, zur Erkennung des MIME-Typs einer Datei.