`rm` in den Papierkorb verschieben

`rm` in den Papierkorb verschieben

Gibt es ein Linux-Skript/eine Linux-Anwendung, die Dateien nicht löscht, sondern an einen speziellen „Papierkorb“-Speicherort verschiebt? Ich hätte das hier gerne als Ersatz für rm(vielleicht sogar als Alias ​​für Letzteres; das hat Vor- und Nachteile).

Mit „Papierkorb“ meine ich einen speziellen Ordner. Ein einzelner mv "$@" ~/.trashist ein erster Schritt, aber im Idealfall sollte dieser auch das Wegwerfen mehrerer Dateien mit gleichem Namen ohne Überschreiben älterer Dateien im Papierkorb ermöglichen undwiederherstellenDateien mit einem einfachen Befehl an ihren ursprünglichen Speicherort zurückschicken (eine Art „Rückgängig machen“). Außerdem wäre es schön, wenn der Papierkorb beim Neustart automatisch geleert würde (oder ein ähnlicher Mechanismus, um endloses Wachstum zu verhindern).

Es gibt Teillösungen dafür, aber insbesondere die Aktion „Wiederherstellen“ ist nicht trivial. Gibt es dafür bereits Lösungen, die nicht auf einem Papierkorbsystem einer grafischen Shell basieren?

(Nebenbei bemerkt gab es endlose Diskussionen darüber, ob dieser Ansatz gerechtfertigt ist, anstatt häufige Backups und VCS zu verwenden. Diese Diskussionen haben zwar einen Sinn, aber ich glaube, dass es für mein Anliegen immer noch eine Nische gibt.)

Antwort1

Da ist einSpezifikation (Entwurf) für Trashauf freedesktop.org. Dies ist anscheinend das, was normalerweise von Desktopumgebungen implementiert wird.

Eine Kommandozeilenimplementierung wäreMüll-CLI. Ohne genauer hingesehen zu haben, scheint es die gewünschte Funktionalität zu bieten. Wenn nicht, sagen Sie uns, inwiefern dies nur eine Teillösung ist.

Was die Verwendung eines beliebigen Programms als Ersatz/Alias ​​betrifft rm, gibt es gute Gründe, dies nicht zu tun. Die wichtigsten für mich sind:

  • Das Programm müsste alle rmOptionen verstehen/verarbeiten und entsprechend handeln.
  • Es besteht das Risiko, dass Sie sich an die Semantik Ihres „neuen rm“ gewöhnen und Befehle mit fatalen Folgen ausführen, wenn Sie auf den Systemen anderer Benutzer arbeiten.

Antwort2

In den vorherigen Antworten werden die Befehle trash-cliund erwähnt rmtrash. Keines davon ist standardmäßig unter Ubuntu 18.04 zu finden, aber der Befehlgioist. gio help trashBefehlsausgaben:

Usage:
  gio trash [OPTION…] [LOCATION...]

Move files or directories to the trash.

Options:
  -f, --force     Ignore nonexistent files, never prompt
  --empty         Empty the trash

Ich habe es getestet mitgio trash FILENAMEin der Befehlszeile, und es funktioniert genauso, als hätte ich die Datei im Dateibrowser ausgewählt und auf die ENTF-Schaltfläche geklickt: Die Datei wird in den Papierkorb des Desktops verschoben. (Der Befehl fordert keine Bestätigung an, obwohl ich die -fOption nicht verwendet habe.)

Das Löschen von Dateien auf diese Weise ist umkehrbar und bequemer, als sie aus Sicherheitsgründen neu zu definieren rmund rm -ijeden Löschvorgang bestätigen zu müssen. Dadurch haben Sie immer noch Pech, wenn Sie versehentlich einen Löschvorgang bestätigen, den Sie nicht hätten bestätigen sollen.

Ich habe alias tt='gio trash'zu meiner Aliasdefinitionsdatei Folgendes hinzugefügt: ttist eine Eselsbrücke für „in den Papierkorb legen“.

Hinzugefügt bei Bearbeitung am 27.06.2018:Auf Server-Rechnern gibt es kein Äquivalent zu einem Papierkorb-Verzeichnis. Ich habe das folgende Bash-Skript geschrieben, das diese Aufgabe erfüllt; auf Desktop-Rechnern verwendet es gio trashund auf anderen Rechnern verschiebt es die als Parameter angegebenen Dateien in ein von ihm erstelltes Papierkorb-Verzeichnis. Das Skript funktioniert erprobt; ich selbst verwende es ständig.Skript am 12.04.2024 aktualisiert.

#!/bin/bash

# move_to_trash
#
# Teemu Leisti 2024-04-12
#
# USAGE:
#
#   Move the file(s) given as argument(s) to the trash directory, if they are
#   not already there.
#
# RATIONALE:
#
#   The script is intended as a command-line equivalent of deleting a file or
#   directory from a graphical file manager. On hosts that implement the
#   FreeDesktop.org specification on trash directories (hereon called "the trash
#   specification"; see
#   https://specifications.freedesktop.org/trash-spec/trashspec-latest.html),
#   that action moves the target file(s) to a built-in trash directory, and that
#   is exactly what this script does.
#
#   On other hosts, this script uses a custom trash directory (~/.Trash/). The
#   analogy of moving a file to trash is not perfect, as the script does not
#   offer the functionalities of restoring a trashed file to its original
#   location or emptying the trash directory. Rather, it offers an alternative
#   to the 'rm' command, thereby giving the user the peace of mind that they can
#   still undo an unintended deletion before emptying the custom trash
#   directory.
#
# IMPLEMENTATION:
#
#   To determine whether it's running on a host that implements the trash
#   specification, the script tests for the existence of (a) the gio command and
#   (b) either directory $XDG_DATA_HOME/Trash/, or, if that environment variable
#   hasn't bee set, of directory ~/.local/share/Trash/. If the test yields true,
#   the script relies on calling 'gio trash'.
#
#   On other hosts:
#     - There is no built-in trash directory, so the script creates a custom
#       directory ~/.Trash/, unless it already exists. (The script aborts if
#       there is an existing non-directory ~/.Trash.)
#     - The script appends a millisecond-resolution timestamp to all the files
#       it moves to the custom trash directory, to both inform the user of the
#       time of the trashing, and to avoid overwrites.
#     - The user will have to perform an undo by commanding 'mv' on a file or
#       directory moved to ~/.Trash/.
#     - The user will have to empty the custom trash directory by commanding:
#           rm -rf ~/.Trash/* ~/.Trash/.*
#
#   The script will not choke on a nonexistent file. It outputs the final
#   disposition of each filename argument: does not exist, was already in trash,
#   or was moved to trash.
#
# COPYRIGHT WAIVER:
#
#   The author dedicates this Bash script to the public domain by waiving all of
#   their rights to the work worldwide under copyright law, including all
#   related and neighboring rights, to the extent allowed by law. You can copy,
#   modify, distribute, and perform the script, even for commercial purposes,
#   all without asking for permission.

if [ -z "$XDG_DATA_HOME" ] ; then
    xdg_trash_directory=$(realpath ~/.local/share/Trash/)
else
    xdg_trash_directory=$(realpath $XDG_DATA_HOME/Trash/)
fi

gio_command_exists=0
if $(command -v gio > /dev/null 2>&1) ; then
    gio_command_exists=1
fi

host_implements_trash_specification=0
if [[ -d "${xdg_trash_directory}" ]] && (( gio_command_exists == 1 )) ; then
    # Executing on a host that implements the trash specification.
    host_implements_trash_specification=1
    trash_directory="${xdg_trash_directory}"
else
    # Executing on other host, so attempt to use a custom trash directory.
    trash_directory=$(realpath ~/.Trash)
    if [[ -e "${trash_directory}" ]] ; then
        # It exists.
        if [[ ! -d "${trash_directory}" ]] ; then
            # But is not a directory, so abort.
            echo "Error: ${trash_directory} exists, but is not a directory."
            exit 1
        fi
    else
        # It does not exists, so create it.
        mkdir "${trash_directory}"
        echo "Created directory ${trash_directory}"
    fi
fi

# Deal with all filenames (a concept that covers names of both files and
# directories) given as arguments.
for file in "$@" ; do
    file_to_be_trashed=$(realpath -- "${file}")
    file_basename=$(basename -- "${file_to_be_trashed}")
    if [[ ! -e ${file_to_be_trashed} ]] ; then
        echo "does not exist:   ${file_to_be_trashed}"
    elif [[ "${file_to_be_trashed}" == "${trash_directory}"* ]] ; then
        echo "already in trash: ${file_to_be_trashed}"
    else
        # ${file_to_be_trashed} exists and is not yet in the trash directory,
        # so move it there.
        if (( host_implements_trash_specification == 1 )) ; then
            gio trash "${file_to_be_trashed}"
        else
            # Move the file to the custom trash directory, with a new name that
            # appends a millisecond-resolution timestamp to the original.
            head="${trash_directory}/${file_basename}"_TRASHED_ON_
            move_file_to="${head}$(date '+%Y-%m-%d_AT_%H-%M-%S.%3N')"
            while [[ -e "${move_file_to}" ]] ; do
                # Generate a new name with a new timestamp, as the previously
                # generated one denoted an existing file or directory. It's very
                # unlikely that this loop needs to be executed even once.
                move_file_to="${head}$(date '+%Y-%m-%d_AT_%H-%M-%S.%3N')"
            done
            # There is no file or directory named ${move_file_to}, so
            # we can use it as the move target.
            /bin/mv "${file_to_be_trashed}" "${move_file_to}"
        fi
        echo "moved to trash:   ${file_to_be_trashed}"
    fi
done

Antwort3

Papierkorb-CLIist eine Linux-Anwendung, die mit apt-get in Ubuntu oder yum in Fedora installiert werden kann. Mit dem Befehl trash listOfFileswird das angegebene Objekt in den Papierkorb verschoben.

Antwort4

Beginnen Sie mit der Definition einer move_to_trashFunktion:

move_to_trash () {
    mv "$@" ~/.trash
}

Dann verwenden Sie den Alias rm​​dafür:

alias rm='move_to_trash'

Sie können „old“ immer aufrufen, rmindem Sie es mit einem Backslash maskieren, wie folgt: \rm.

Ich weiß nicht, wie ich das Papierkorbverzeichnis beim Neustart leeren kann (das hängt von Ihrem System ab, Sie müssen möglicherweise in den rc*Skripten nachsehen), aber es könnte auch sinnvoll sein, eine Aufgabe zu erstellen cron, die das Verzeichnis regelmäßig leert.

verwandte Informationen