Portapapeles para copiar y pegar archivos en la línea de comandos?

25

En Bash, supongamos que visito un directorio y luego otro directorio. Me gustaría copiar un archivo del primer directorio al segundo directorio, pero sin especificar los nombres de ruta largos de ellos. ¿Es posible?

Mi solución temporal es usarla /tmpcomo un lugar temporal para almacenar una copia del archivo. cp myfile /tmpcuando estoy en el primer directorio, y luego cp /tmp/myfile .cuando estoy en el segundo directorio. Pero puedo verificar si el archivo sobrescribirá algo en /tmp.

¿Hay algo similar a un portapapeles para copiar y pegar un archivo?

Tim
fuente
1
Debe escribir el cdcomando, de modo que pueda cd -volver al directorio anterior, presionar la flecha hacia arriba para recuperar el cdcomando y editar la línea en cplugar de cd. (ctrl-a (principio de línea), alt-d (palabra cp -aclave ) , ctrl-e (final de línea)).
Peter Cordes
Con Emacs y M-x termpuede usar el portapapeles de Emacs.
Pål GD
1
Puedes usar Midnight Commander y olvidarte de saltar por los aros.
Deer Hunter
@ PålGD La gente dice que Emacs 'es un sistema operativo ... La mayoría tiene portapapeles;)
Volker Siegel
@JeffSchaller gracias ................................
Tim

Respuestas:

59

Usando Bash, solo visitaría los directorios:

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

Luego, usaría el acceso directo ~-, que apunta al directorio anterior:

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

Si uno desea visitar directorios en orden inverso, entonces:

$ cp -v fileA.txt ~-
$ cp -v fileB.txt ~-
$ cp -v fileC.txt ~-
Anderson Medeiros Gomes
fuente
25
Hace más de 20 años que uso shells de Unix / Linux, y no conocía ese acceso directo.
Dubu
44
Huh, ese es un atajo útil para "$OLDPWD". ¿Por qué tres cpcomandos separados , sin embargo? cp -a ~-/file[1-3].txt .
Peter Cordes
44
En realidad, los tres cpson ejemplos. En el mundo real, los caracteres comodín también se pueden usar para simplificar la tarea de copia.
Anderson Medeiros Gomes
2
Iba a mencionar algo pushdy analizar dirs... pero esto es mucho, mucho mejor. Le sugiero que agregue el hecho de que "$OLDPWD"es exactamente equivalente ~-y más portátil (útil para aquellos que no lo usan bash)
Wildcard
1
~+Es igualmente un acceso directo para"$PWD"
Paul Evans
11

Si veía que esa situación se presentaba de forma puntual, podría:

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

Si hubiera directorios en los que me encontraba copiando archivos de forma regular, probablemente definiría algunas variables mnemotécnicas para ellos en mi .profile.

Editado para agregar:

Después de dormir en él, me pregunté qué tan cerca podría llegar a otros comportamientos de GUI / OS en los que selecciona algún número de archivos, los "corta" o los "copia", luego los "pega" en otro lugar. El mejor mecanismo de selección que pude encontrar fue su cerebro / preferencias más la función de bloqueo del shell. No soy muy creativo con los nombres, pero esta es la idea básica (en la sintaxis de 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
}

Para usarlo, coloque el código en ~ / .bash_profile, luego cden el directorio de origen y ejecute copyfiles glob*hereo cutfiles glob*here. Todo lo que sucede es que su shell expande los globos y pone esos nombres de archivo en una matriz. Luego se cddirige al directorio de destino y se ejecuta pastefiles, que ejecuta un cpcomando para cada archivo fuente. Si anteriormente había "cortado" los archivos, pegar archivos también elimina el archivo de origen (o intenta). Esto no verifica los errores (de los archivos existentes, antes de potencialmente bloquearlos con el cp; o que tiene permisos para eliminar los archivos durante un "corte", o que puede volver a acceder al directorio de origen después de mudarse de eso).

Jeff Schaller
fuente
44
Para su uso único, $OLDPWDya existe, que puede acortarse ~-en bash y zsh.
Gilles 'SO- deja de ser malvado'
5

Creo que ~-es la respuesta correcta, pero tenga en cuenta que bash tiene un editor de línea incorporado que puede copiar / pegar texto.

Si está en modo emacs, puede recuperar su cdcomando del historial y usarlo Control-upara matar la línea en el "portapapeles" de bash llamado el anillo de matar (también hay otras formas). Luego puede tirar de esta cadena a un nuevo comando en cualquier momento con Control-y. Obviamente, en su ejemplo, esto depende de que haya utilizado un nombre de directorio absoluto en su cdcomando.

También puede usar el interesante enlace de teclas predeterminado de Meta-.. Esto copia la última palabra del comando anterior en su línea actual. Si se repite, cada vez retrocede un comando en el historial. Así que si usted hace una cd /x, a continuación, cd /yseguido por cdMeta-.Meta-.usted tendrá /xen su entrada.

meuh
fuente
5

Ampliando la respuesta de Anderson M. Gomes , Bash le permite consultar cualquier directorio anterior en su pila de directorios escribiendo ~N(o ~+N) dónde Nestá la posición en la pila de directorios. Por ejemplo:

# 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

Ahora puede copiar un archivo entre dos directorios anteriores, ninguno de ellos el actual, con:

cp -v ~3/file1.txt ~2

Para resolver el problema del póster original, haría lo siguiente:

$ 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 gran conjunto de archivos, puede enumerar sus nombres en un archivo de manifiesto y luego hacer la copia desde el directorio de origen:

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

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

Consulte también: esta sección de la página de manual de Bash


De manera similar, en Tcsh, puede usar la =2notación (en lugar de ~2) para referirse al segundo directorio en su pila de directorios.

Consulte también: esta sección de la página de manual de Tcsh

jskroch
fuente
4

cuando esté en el primer directorio, digamos la fuente o, srcen resumen, ejecute

src=${PWD}

luego cden el segundo directorio y ejecutar:

cp -i ${src}/filename .

la -iopción le preguntará si desea sobrescribir, si hay un archivo duplicado

MelBurslan
fuente
Gracias. Es incluso mejor sin especificar el nombre del archivo.
Tim
4

Una variación en la respuesta de anderson-m-gomes. Usando Bash, solo visitaría los directorios:

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

Luego, usaría la variable $ OLDPWD, que apunta al directorio anterior:

$ cp -v $OLDPWD/file1.txt .

Si uno desea visitar directorios en orden inverso, entonces:

$ cp -v fileA.txt $OLDPWD/
Scott Carlson
fuente
3
+1, pero olvidó "citar" sus expansiones variables. Si $OLDPWDcontiene espacios, esto se rompe. Además, siempre uso cp -a. Además, es lamentable que la finalización de tabulación se rompa en expansiones variables. Sin embargo, puede usar ctrl-alt-e para expandir la línea de comandos actual después de escribir la parte $ OLDPWD.
Peter Cordes
1
~-es un atajo para$OLDPWD
Gilles 'SO- deja de ser malvado'
Solo estaba señalando otra variación, ya que Unix / Linux está llena de ellas. Es curioso, que he estado usando Linux durante> 20 años, y nunca había visto ~ - antes. Además, $ OLDPWD es fácil de recordar.
Scott Carlson
3

Si en bash, usaría pushd y popd . Estos comandos mantienen una práctica pila de directorios FIFO para su uso posterior. Puede consultar la pila en cualquier momento utilizando directorios .

Como tal lo haría:

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

Puedes usar 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.

Ejemplo:

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

Visite también xsel .

Pandya
fuente
Eso hace una tar | gzipentrada / salida del portapapeles X. Un poco torpe en comparación con cp, y no se generaliza a hacer enlaces simbólicos o enlaces duros. ( cp -aso cp -al)
Peter Cordes
1

Puede consultar el clipboard-filesscript aquí: https://github.com/larspontoppidan/clipboard-files

Proporciona comandos como ccopy, ccuty cpasteque utilizan el portapapeles del entorno de escritorio y permiten copiar / pegar archivos de forma intuitiva:

ccopy myfile
cd <second directory>
cpaste

A medida que se usa el portapapeles del entorno de escritorio, la copia / pegado interactuará con los archivos colocados en el portapapeles en otros programas como administradores de archivos e IDE. Al menos funciona en escritorios tipo Gnome.

Revelación completa, escribí el guión después de dejar de encontrar algo así por ahí ...

Larsp
fuente