Alias ​​für den Papierkorb erstellen

8

Ich bin ein Neuling. Ich habe einen Alias ​​in der .bashrc-Datei wie folgt festgelegt.

alias myrm='mv /home/user/Trash/*'

Der Zweck ist, dass, wenn ich einen Myrmenkommentar verwende, zum Beispiel $ myrm foo, die Datei "foo" in den Papierkorb verschoben werden muss, der sich in meinem Basisordner befindet (/ home / user / Trash).

Dann habe ich getan

$source ~/.bashrc

Wenn ich danach versuche, myrm durch Eingabe von $ myrm foo zu verwenden, wird die folgende Fehlermeldung angezeigt.

mv: kann nicht stat '/ home / user / Trash / *': Keine solche Datei oder kein solches Verzeichnis

Wie kann dieses Problem gelöst werden?

Phänomen
quelle
2
Syntax ist mv SOURCE DESTINATIONund nicht mv DESTINATION SOURCE. Siehe man mvund help alias. Verwenden Sie eine Funktion. Siehe help function.
Cyrus
Untersuchen Sie Positionsparameter . Ihr Skript möchte, dass ein $1Ordner zwischen mv und dem Zielordner das 'foo' übernimmt, das Sie beim Ausführen des Skripts angeben.
Mcalex
7
Problemumgehung:alias myrm='mv -t /home/user/Trash'
Cyrus
1
@ Cyrus Es ist keine Problemumgehung, es ist der richtige Weg .
Kamil Maciorowski
Vielen Dank an @Cyrus und andere für Kommentare. Der Alias ​​myrm = 'mv -t / home / user / Trash /} hat das Problem gelöst.
Phänomen

Antworten:

18

Erstens verwenden Sie nicht, $wenn Sie einen Alias ​​aufrufen.  $dient zum Erweitern einer Variablen (und einiger anderer Dinge, die für diese Frage nicht besonders relevant sind).

Zweitens funktionieren Aliase ein wenig wie Variablen, in dem Sinne, dass sie (auf die Gefahr hin, sich ein wenig zu vereinfachen) nur zu einer Reihe von Wörtern erweitert werden. Sie sagen, Sie möchten es tun myrm foo, aber das würde sich erweitern mv /home/user/Trash/* foo, was keinen Sinn ergibt.

Eine einfache Lösung wäre, den Alias ​​zu definieren mv -t /home/user/Trash, der funktionieren würde, weil er den mvunterstützt

mv -t destination_dir Datei
Syntax als Alternative zum

mv filedestination_dir
Syntax.

Mit einer Shell-Funktion können Sie jedoch mehr Flexibilität erzielen. Diese kombinieren die Flexibilität von Skripten mit dem (geringen) Overhead von Aliasen. Zum Beispiel,

myrm() { mv "$@" /home/user/Trash; }

wird dazu führen myrm foo, interpretiert zu werden als mv foo /home/user/Trash.

G-Man sagt "Reinstate Monica"
quelle
9
Ich denke, das $ist von seiner Shell, normalerweise beginnen alle Zeilen in einem Terminal damit $, dass es sich um eine Nicht-Root-Shell handelt
Ferrybig
Ja, das könnte es sein, was er meint.
G-Man sagt "Reinstate Monica"
7

Wahrscheinlich ist die einfachere Lösung die Verwendung eines trash-cliPakets. Dann können Sie einfach tun alias myrm=trashund dann trash fooerreichen, was Sie wollen. Nur dass foo jetzt gehen wird~/. local/share/Trash

Deshmukh
quelle
4

Das Problem ist, mit muss mvman es gerne benutzen mv source destination.

Mit Ihrem Alias ​​ist es umgekehrt mv destination source.

Außerdem benötigen Sie das Sternchen *am Ende nicht, da es mit dem Ziel als Ordner funktioniert. Stellen Sie sicher, dass Ihr Ordner mit /home/user/Trashexistiert mkdir /home/user/Trash.

Um Ihre Alias-Idee zu lösen, würde ich Ihnen empfehlen, sich diese Fragen zum Stackoverflow anzuschauen:

Dies wird zu dieser Lösung führen; Bitte füge dies zu deinem hinzu ~/.bashrcund mache ein source ~/.bashrcnach dem Hinzufügen:

myrm() {
 /bin/mv "$@" /home/user/Trash/
}
Chloeoe
quelle
Die Antwort ist in den Links, ich mag es nicht, die Arbeit anderer Leute zu kopieren
Chloeesoe
Ich habe diese Antwort gesehen, als es die einzige hier war. Wenn es eine explizite Lösung gegeben hätte, hätte ich sie sofort positiv bewertet. Ich habe gezögert, aber irgendwann positiv bewertet, weil die Links nützlich sind, Einblicke geben und in Stack Exchange bleiben. Das Hauptproblem bei Nur-Link-Antworten ist, dass das verknüpfte Ziel möglicherweise verschwindet. Ich gehe jedoch davon aus, dass diese ganze Frage plötzlich verschwindet, wenn diese Ziele plötzlich aus dem Internet verschwinden.
Kamil Maciorowski
fügte die Lösung hinzu und hinterließ den am besten passenden Link, der andere Link war stackoverflow.com/q/4438147/7311363 qft
chloesoe
2

Wie in den Kommentaren angegeben, ist die mvSyntax anders:

myrm(){ mv "$@" $HOME/Trash/; }

das kann mehrere Dateien als Argument behandeln

Dieser einfache Alias ​​behandelt jedoch nicht die Kollision von Dateinamen sowie Metadaten (von wo sie entfernt wurden, ...).

Für eine vollständigere Lösung können Sie einfach das Paket verwenden, trash-clidas ziemlich gut ist und nur wenige Tools enthält (z. B. leere Dateien, die X Tage lang im Papierkorb liegen, ...).

vera
quelle
1

Es gibt einen weiteren nützlichen Alias, den Sie in Betracht ziehen könnten, wenn Sie ein gvfs-binPaket auf Ihrem Host installiert haben :

alias myrm='gvfs-trash`

Es verschiebt Ihre Dateien in den Papierkorb. Auch sind die richtigen Dateien in Ihrem $ TRASH Ordner geschrieben (wie info/, files/...). Sie müssen sich also keine Sorgen machen. Beispiel: Wenn Sie in den Papierkorb gehen und darauf klicken restore, funktioniert dies einwandfrei.

Das ist überflüssig, trash-cliaber auf Ihrem Host ist möglicherweise nur einer bereits installiert. Wenn Sie also kein Trash-Cli haben, probieren Sie es aus.

PTRK
quelle
Ist das besser oder schlechter als das trash-cliPaket? Dies erfordert die Installation von gvfs-bin, das auch nicht auf meinem System installiert ist. Ich war noch nie zuvor auf gvfs gestoßen und habe es unter en.wikipedia.org/wiki/GVfs ein wenig nachgelesen . Ich bin mir immer noch nicht sicher, was seine Existenzberechtigung ist, aber das ist eine andere Frage.
Joe
1
Auf allen Systemen (meistens Ubuntu), die ich verwendet habe, war es bereits installiert, deshalb habe ich es vorgeschlagen; Aber da Sie mir sagen, dass es nicht obligatorisch ist, trash-clikann es nicht besser oder schlechter sein. Ich werde meine Antwort entsprechend aktualisieren
PTRK
0

Du musst tun

mv "$1" /home/user/Trash/
oder
mv -t /home/user/Trash/
anstatt
mv /home/user/Trash/
Manpage hier

JustAProGamerAndDeveloper
quelle
Das erste ( mv "$1" /home/user/Trash/) funktioniert nicht in einem Alias ​​(worum es in der Frage geht) und ist in einer Funktion von begrenztem Wert (wie ich in meiner Antwort sagte , mv "$@" /home/user/Trashist besser). Das zweite ( mv -t /home/user/Trash/) war bereits in meiner Antwort und Cyrus 'Kommentar zuvor angegeben.
G-Man sagt "Reinstate Monica"