Appunti per copiare e incollare file nella riga di comando?


25

In Bash, supponiamo che io visiti una directory e quindi un'altra directory. Vorrei copiare un file dalla prima directory alla seconda directory, ma senza specificare i nomi lunghi di essi. È possibile?

La mia soluzione temporanea è utilizzare /tmpcome luogo temporaneo per archiviare una copia del file. cp myfile /tmpquando sono nella prima directory e poi cp /tmp/myfile .quando sono nella seconda directory. Ma posso verificare se il file sovrascriverà qualcosa /tmp.

Esiste qualcosa di simile agli appunti per copiare e incollare un file?


1
Devi digitare il cdcomando, quindi puoi semplicemente cd -tornare alla directory precedente, freccia su per richiamare il cdcomando e modificare la riga in modo che sia cpinvece di cd. (ctrl-a (inizio riga), alt-d (kill-word) cp -a,, ctrl-e (fine riga)).
Peter Cordes,

Con Emacs e M-x termpuoi usare gli appunti di Emacs.
Pål GD

1
Puoi usare Midnight Commander e dimenticare di saltare attraverso i cerchi.
Deer Hunter

@ PålGD La gente dice che Emacs 'è un sistema operativo ... La maggior parte ha degli appunti;)
Volker Siegel

@JeffSchaller grazie ................................
Tim

Risposte:


59

Usando Bash, vorrei solo visitare le directory:

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

Quindi, vorrei utilizzare il collegamento ~-, che punta alla directory precedente:

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

Se si desidera visitare le directory in ordine inverso, quindi:

$ cp -v fileA.txt ~-
$ cp -v fileB.txt ~-
$ cp -v fileC.txt ~-

25
+1 Sto usando le shell Unix / Linux da più di 20 anni ormai, e non conoscevo quella scorciatoia.
Dubu

4
Huh, questa è una scorciatoia utile per "$OLDPWD". Perché tre cpcomandi separati , però? cp -a ~-/file[1-3].txt .
Peter Cordes,

4
In realtà, i tre cpsono esempi. Nel mondo reale, i caratteri jolly possono anche essere utilizzati per semplificare l'attività di copia.
Anderson Medeiros Gomes

2
Stavo per menzionare qualcosa pushde analizzare dirs... ma questo è molto, molto meglio. Ti suggerisco di aggiungere il fatto che "$OLDPWD"è esattamente equivalente ~-ed è più portatile (utile per chi non lo utilizza bash).
Wildcard

1
~+è anche una scorciatoia per"$PWD"
Paul Evans,

11

Se vedessi che la situazione si presenta come una tantum, potrei:

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

Se ci fossero delle directory in cui mi sono ritrovato a copiare i file semi-regolarmente, probabilmente definirei alcune variabili mnemoniche per loro nel mio .profile.

Modificato per aggiungere:

Dopo aver dormito su di esso, mi chiedevo quanto potevo avvicinarmi ad altri comportamenti della GUI / OS in cui si selezionava un certo numero di file, li "tagliava" o "copia", quindi li "incolla" da qualche altra parte. Il miglior meccanismo di selezione che ho potuto inventare è stato il tuo cervello / le tue preferenze più la funzione di vibrazione della shell. Non sono molto creativo con i nomi, ma questa è l'idea di base (nella sintassi di Bash):

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
}

Per usarlo, inserire il codice in ~ / .bash_profile, quindi cdnella directory di origine ed eseguire copyfiles glob*hereo cutfiles glob*here. Tutto ciò che accade è che la tua shell espande i globs e mette quei nomi di file in un array. Si cdpassa quindi alla directory di destinazione ed esegui pastefiles, che esegue un cpcomando per ciascun file di origine. Se in precedenza avevi "tagliato" i file, incolla anche i file di origine (o, prova a). Ciò non esegue alcun controllo degli errori (di file esistenti, prima di poterli eventualmente ostruire con il cp; o che si dispone delle autorizzazioni per rimuovere i file durante un "taglio" o che è possibile accedere nuovamente alla directory di origine dopo essersi spostati di esso).


4
Per il tuo unico, $OLDPWDesiste già, che può essere abbreviato ~-in bash e zsh.
Gilles 'SO-smetti di essere malvagio' il

5

Penso che ~-sia la risposta giusta, ma nota che bash ha un editor di linee integrato che può copiare / incollare il testo.

Se sei in modalità emacs puoi richiamare il tuo cdcomando dalla cronologia e usarlo Control-uper uccidere la linea negli "appunti" bash chiamati kill-ring (ci sono anche altri modi). È quindi possibile trascinare questa stringa in un nuovo comando in qualsiasi momento con Control-y. Ovviamente, nel tuo esempio questo dipende dal fatto che tu abbia usato un nome di directory assoluto nel tuo cdcomando.

È inoltre possibile utilizzare l'interessante associazione di tasti predefinita di Meta-.. Questo copia l'ultima parola del comando precedente nella riga corrente. Se ripetuto, ogni volta torna indietro un comando nella cronologia. Quindi, se fai un cd /x, quindi cd /yseguito cdMeta-.Meta-.avrai /xnel tuo input.


5

Espandendo la risposta di Anderson M. Gomes , Bash consente di fare riferimento a qualsiasi directory precedente nel proprio stack di directory digitando ~N(o ~+N) dove si Ntrova la posizione nello stack di dir. Per esempio:

# 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

Ora puoi copiare un file tra due directory precedenti, nessuna delle due in quella corrente, con:

cp -v ~3/file1.txt ~2

Per risolvere il problema del poster originale, dovresti:

$ 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 .

Con un ampio set di file, è possibile elencare i loro nomi in un file manifest e quindi eseguire la copia dalla directory di origine:

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

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

Vedi anche: questa sezione della pagina man di Bash


Allo stesso modo, in Tcsh, puoi usare =2 notazione (piuttosto che ~2) per fare riferimento alla seconda dir sul tuo stack dir.

Vedi anche: questa sezione della pagina man di Tcsh


4

quando sei nella prima directory, diciamo l'origine o srcin breve, esegui

src=${PWD}

quindi cdnella seconda directory ed eseguire:

cp -i ${src}/filename .

l' -iopzione ti chiederà se vuoi sovrascrivere se c'è un file duplicato


Grazie. È ancora meglio senza specificare il nome file.
Tim

4

Una variazione sulla risposta di anderson-m-gomes. Usando Bash, vorrei solo visitare le directory:

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

Quindi, vorrei utilizzare la variabile $ OLDPWD, che punta alla directory precedente:

$ cp -v $OLDPWD/file1.txt .

Se si desidera visitare le directory in ordine inverso, quindi:

$ cp -v fileA.txt $OLDPWD/

3
+1, ma hai dimenticato di "citare" le espansioni variabili. Se $OLDPWDcontiene spazi, questo si rompe. Inoltre, lo uso sempre cp -a. Inoltre, è un peccato che il completamento della scheda sia interrotto su espansioni variabili. Puoi usare ctrl-alt-e per espandere la shell della riga di comando corrente, tuttavia, dopo aver digitato la parte $ OLDPWD.
Peter Cordes,

1
~-è una scorciatoia per$OLDPWD
SO di Gilles

Stavo solo sottolineando un'altra variante, poiché Unix / Linux ne è piena. Divertente, che uso Linux da> 20 anni e non avevo mai visto ~ - prima. Inoltre, $ OLDPWD è facile da ricordare.
Scott Carlson,

3

Se in bash, userei pushd e popd . Questi comandi mantengono un utile stack di directory FIFO per un uso successivo. Puoi consultare lo stack in qualsiasi momento usando dirs .

Come tale farei:

pushd .
cd /somewhere/else
cp "`popd`/myfile"

2

Puoi usare 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.

Esempio:

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

Visita anche xsel .


Questo fa tar | gzipentrare / uscire dagli Appunti X. Un po 'goffa rispetto a cp, e non generalizza a fare collegamenti simbolici o hardlink. ( cp -aso cp -al)
Peter Cordes

1

Puoi consultare lo clipboard-filesscript qui: https://github.com/larspontoppidan/clipboard-files

Esso fornisce comandi come ccopy, ccute cpasteche utilizzano gli appunti ambiente desktop e consente la copia intuitiva / incolla di file:

ccopy myfile
cd <second directory>
cpaste

Quando vengono utilizzati gli Appunti dell'ambiente desktop, la copia / incolla interagirà con i file inseriti negli Appunti in altri programmi come File Manager e IDE. Almeno funziona su desktop simili a Gnome.

Completa divulgazione, ho scritto la sceneggiatura dopo aver rinunciato a trovare qualcosa di simile là fuori ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.