Zwischenablage zum Kopieren und Einfügen von Dateien in der Kommandozeile?

25

Angenommen, ich besuche in Bash ein Verzeichnis und dann ein anderes Verzeichnis. Ich möchte eine Datei aus dem ersten Verzeichnis in das zweite Verzeichnis kopieren, ohne jedoch deren lange Pfadnamen anzugeben. Ist es möglich?

Meine vorübergehende Lösung besteht darin /tmp, eine Kopie der Datei als temporären Speicherort zu verwenden. cp myfile /tmpWenn ich im ersten Verzeichnis und dann cp /tmp/myfile .im zweiten Verzeichnis bin. Ich kann aber prüfen, ob die Datei irgendetwas überschreibt /tmp.

Gibt es etwas Ähnliches wie eine Zwischenablage zum Kopieren und Einfügen einer Datei?

Tim
quelle
1
Sie haben den Typ - cdBefehl, so können Sie einfach cd -auf das vorherige Verzeichnis zurück zu gehen, up-Pfeil , um das wieder zu cdBefehl, und bearbeiten Sie die Zeile sein cpstatt cd. (Strg-a (Zeilenanfang), Alt-d ( cp -aAbschusswort ) , Strg-e (Zeilenende)).
Peter Cordes
Mit Emacs und können M-x termSie die Zwischenablage von Emacs verwenden.
Pål GD
1
Sie können Midnight Commander verwenden und vergessen, durch die Reifen zu springen.
Deer Hunter
@ PålGD Leute sagen, Emacs 'ist ein Betriebssystem ... Die meisten haben Zwischenablagen;)
Volker Siegel
@ JeffSchaller danke ................................
Tim

Antworten:

59

Mit Bash würde ich nur die Verzeichnisse besuchen:

$ cd /path/to/source/directory
$ cd /path/to/destination/directory

Dann würde ich die Verknüpfung verwenden ~-, die auf das vorherige Verzeichnis verweist:

$ cp -v ~-/file1.txt .
$ cp -v ~-/file2.txt .
$ cp -v ~-/file3.txt .

Wenn man Verzeichnisse in umgekehrter Reihenfolge besuchen möchte, dann:

$ cp -v fileA.txt ~-
$ cp -v fileB.txt ~-
$ cp -v fileC.txt ~-
Anderson Medeiros Gomes
quelle
25
+1 Ich verwende seit mehr als 20 Jahren Unix / Linux-Shells und kannte diese Verknüpfung nicht.
Dubu
4
Huh, das ist eine praktische Abkürzung für "$OLDPWD". Warum aber drei getrennte cpBefehle? cp -a ~-/file[1-3].txt .
Peter Cordes
4
Tatsächlich sind die drei cpBeispiele. In der Praxis können auch Platzhalterzeichen verwendet werden, um die Kopieraufgabe zu vereinfachen.
Anderson Medeiros Gomes
2
Ich wollte etwas über pushdund das Parsen erwähnen dirs... aber das ist weit, weit besser. Ich schlage vor, Sie fügen die Tatsache, "$OLDPWD"die genau gleichwertig ist ~-und portabler ist (hilfreich für diejenigen, die nicht verwenden bash.)
Wildcard
1
~+ist ebenfalls eine Abkürzung für"$PWD"
Paul Evans
11

Wenn ich diese Situation einmalig sehen würde, könnte ich:

a=`pwd`
cd /somewhere/else
cp "$a/myfile" .

Wenn es Verzeichnisse gäbe, in die ich Dateien halbjährlich kopiert habe, würde ich wahrscheinlich in meinem .profile einige mnemonische Variablen für sie definieren.

Bearbeitet, um hinzuzufügen:

Nachdem ich darauf geschlafen hatte, fragte ich mich, wie weit ich mit anderen GUI / OS-Verhaltensweisen kommen könnte, bei denen Sie eine bestimmte Anzahl von Dateien auswählen, ausschneiden oder kopieren und sie dann an einer anderen Stelle einfügen. Der beste Auswahlmechanismus, den ich finden konnte, war Ihr Gehirn / Ihre Vorlieben sowie die Globbing-Funktion der Shell. Ich bin nicht sehr kreativ im Benennen, aber dies ist die Grundidee (in Bash-Syntax):

function copyfiles {
  _copypastefiles=("$@")
  _copypastesrc="$PWD"
  _copypastemode=copy
}

function cutfiles {
  _copypastefiles=("$@")
  _copypastesrc="$PWD"
  _copypastemode=cut
}

function pastefiles {
  for f in "${_copypastefiles[@]}"
  do
    cp "${_copypastesrc}/$f" .
    if [[ ${_copypastemode} = "cut" ]]
    then
      rm "${_copypastesrc}/$f"
    fi
  done
}

Um es zu benutzen, legen Sie den Code in ~ / .bash_profile, dann cdin das Quellverzeichnis und führen Sie entweder copyfiles glob*hereoder aus cutfiles glob*here. Alles, was passiert, ist, dass Ihre Shell die Globs erweitert und diese Dateinamen in ein Array einsetzt. Sie wechseln dann cdin das Zielverzeichnis und führen aus pastefiles, welches cpfür jede Quelldatei einen Befehl ausführt . Wenn Sie zuvor die Dateien "ausgeschnitten" hatten, werden durch Pastefiles auch die Quelldateien entfernt (oder versucht). Dies führt keine Fehlerüberprüfung durch (von vorhandenen Dateien, bevor diese möglicherweise mit dem gelöscht werden cp; oder Sie haben die Berechtigung, die Dateien während eines "Ausschnitts" zu entfernen, oder Sie können nach dem Auszug erneut auf das Quellverzeichnis zugreifen davon).

Jeff Schaller
quelle
4
Für Ihre einmalige, $OLDPWDbereits vorhanden, die ~-in Bash und Zsh gekürzt werden kann .
Gilles 'SO - hör auf böse zu sein'
5

Ich denke, das ~-ist die richtige Antwort, aber beachte, dass bash einen eingebauten Zeileneditor hat , der Text kopieren / einfügen kann.

Wenn Sie in Emacs - Modus sind Sie erinnern cdBefehl aus der Geschichte, und die Verwendung Control-uzu töten die Linie in dem bash „Zwischenablage“ der Kill-Ring genannt (es gibt auch andere Möglichkeiten , auch). Sie können diesen String dann jederzeit mit in einen neuen Befehl ziehen Control-y. In Ihrem Beispiel hängt dies natürlich davon ab, dass Sie in Ihrem cdBefehl einen absoluten Verzeichnisnamen verwendet haben .

Sie können auch die interessante Standardschlüsselbindung von verwenden Meta-.. Dadurch wird das letzte Wort des vorherigen Befehls in Ihre aktuelle Zeile kopiert . Wenn dies wiederholt wird, wird jedes Mal ein Befehl im Verlauf zurückgesetzt. Wenn Sie also eine machen cd /x, haben Sie , cd /ygefolgt von cdMeta-.Meta-., /xIhre Eingabe.

meuh
quelle
5

Aufbauend auf die Antwort von Anderson M. Gomes , Bash können Sie durch Eingabe in Ihrem Verzeichnis Stack jede vorherige Verzeichnis beziehen ~N(oder ~+N) , wo Nist die Position auf dem Richt - Stack. Beispielsweise:

# go some places
$ cd /path/to/source/directory
$ pushd /path/to/destination/directory
$ pushd $HOME
$ pushd /tmp

# show the current dir stack
$ dirs -v
0 /tmp
1 ~
2 /path/to/destination/directory
3 /path/to/source/directory

Jetzt können Sie eine Datei zwischen zwei früheren Verzeichnissen kopieren, von denen keines das aktuelle ist.

cp -v ~3/file1.txt ~2

Um das Problem des ursprünglichen Posters zu lösen, gehen Sie wie folgt vor:

$ cd /path/to/source/directory
$ pushd /path/to/destination/directory

# show the current dir stack
$ dirs -v
0 /path/to/destination/directory
1 /path/to/source/directory

# copy
cp -v ~1/file[123].txt .

Bei einer großen Anzahl von Dateien können Sie deren Namen in einer Manifest-Datei auflisten und dann die Kopie aus dem Quellverzeichnis erstellen:

$ cd /path/to/destination/directory
$ pushd /path/to/source/directory

# copy
cp -v $(cat files_to_copy.list) ~1

Siehe auch: dieser Abschnitt der Bash-Manpage


Ebenso können Sie in Tcsh die =2Notation (anstatt ~2) verwenden, um auf das zweite Verzeichnis in Ihrem Verzeichnisstapel zu verweisen.

Siehe auch: dieser Abschnitt der Tcsh-Manpage

jskroch
quelle
4

Wenn Sie sich im ersten Verzeichnis befinden, lassen Sie uns die Quelle sagen oder srckurz ausführen

src=${PWD}

dann cdin das zweite Verzeichnis und führe aus:

cp -i ${src}/filename .

Bei dieser -iOption werden Sie gefragt, ob Sie eine Datei überschreiben möchten, die doppelt vorhanden ist

MelBurslan
quelle
Vielen Dank. Es ist sogar noch besser, ohne den Dateinamen anzugeben.
Tim
4

Eine Variation der anderson-m-gomes-Reaktion. Mit Bash würde ich nur die Verzeichnisse besuchen:

$ cd /path/to/source/directory
$ cd /path/to/destination/directory

Dann würde ich die Variable $ OLDPWD verwenden, die auf das vorherige Verzeichnis verweist:

$ cp -v $OLDPWD/file1.txt .

Wenn man Verzeichnisse in umgekehrter Reihenfolge besuchen möchte, dann:

$ cp -v fileA.txt $OLDPWD/
Scott Carlson
quelle
3
+1, aber Sie haben vergessen, Ihre variablen Erweiterungen "anzugeben". Wenn $OLDPWDLeerzeichen enthalten sind, wird dies unterbrochen. Auch benutze ich immer cp -a. Es ist auch bedauerlich, dass die Tab-Vervollständigung bei variablen Erweiterungen unterbrochen wird. Sie können Strg-Alt-E verwenden, um die aktuelle Befehlszeile in der Shell zu erweitern, nachdem Sie den $ OLDPWD-Teil eingegeben haben.
Peter Cordes
1
~-ist eine Abkürzung für$OLDPWD
Gilles 'SO - hör auf, böse zu sein'
Ich habe nur auf eine andere Variante hingewiesen, da Unix / Linux voll davon ist. Komisch, dass ich Linux seit über 20 Jahren benutze und ~ - noch nie gesehen habe. Außerdem ist $ OLDPWD leicht zu merken.
Scott Carlson
3

Wenn in Bash, würde ich Pushd und Popd verwenden . Diese Befehle speichern einen praktischen FIFO-Stapel von Verzeichnissen zur späteren Verwendung. Sie können den Stapel jederzeit mit dirs abrufen .

Als solches würde ich tun:

pushd .
cd /somewhere/else
cp "`popd`/myfile"
Rui F Ribeiro
quelle
2

Sie können verwenden xclip:

NAME
       xclip - command line interface to X selections (clipboard)

SYNOPSIS
       xclip [OPTION] [FILE]...

DESCRIPTION
       Reads  from standard in, or from one or more files, and makes the data available as an X selection for pasting
       into X applications. Prints current X selection to standard out.

Beispiel:

$ cd /path/to/dir1
$ xclip-copyfile file1 file2
$ cd /path/to/dir2
$ xclip-pastefile
file1 file2

Besuchen Sie auch xsel .

Pandya
quelle
Das macht ein tar | gzipin / aus der X-Zwischenablage. Etwas klobig im Vergleich zu cpund verallgemeinert sich nicht darauf, Symlinks oder Hardlinks zu erstellen. ( cp -asoder cp -al)
Peter Cordes
1

Sie können das clipboard-filesSkript hier überprüfen : https://github.com/larspontoppidan/clipboard-files

Es bietet Befehle wie ccopy, ccutund cpastedass den Desktop - Umgebung Zwischenablage verwenden und erlaubt eine intuitive Kopieren / Einfügen von Dateien:

ccopy myfile
cd <second directory>
cpaste

Wenn die Zwischenablage der Desktop-Umgebung verwendet wird, interagiert das Kopieren / Einfügen mit den Dateien, die in anderen Programmen wie Dateimanagern und IDEs in der Zwischenablage abgelegt sind. Zumindest funktioniert es auf Gnome-ähnlichen Desktops.

Vollständige Offenlegung, ich habe das Drehbuch geschrieben, nachdem ich aufgehört hatte, so etwas zu finden ...

Larsp
quelle