Copie y pegue un archivo / directorio desde la línea de comandos

17

En lugar de usar el siguiente comando:

cp {archivo fuente} {archivo dest}

Quiero poder copiar un archivo en el portapapeles y pegarlo en otro lugar, en otro directorio. algo como esto:

/ usr / local / dir1 # cp {archivo fuente}
/ usr / local / dir1 # cd / usr / local / dir2
/ usr / local / dir2 # paste

¿Es posible?

Meysam
fuente

Respuestas:

17

Creo que deberías hacer algo como lo hacen las aplicaciones GUI. Mi idea para hacer esto es escribir dos funciones para Copiar y Pegar, donde Copiar escribe la ruta de los archivos que se copiarán en un archivo temporal y Pegar lee esas rutas y simplemente llama al cpcomando. Mi implementación (para poner en el .bashrcarchivo) es la siguiente:

function Copy {
    touch ~/.clipfiles
    for i in "$@"; do
      if [[ $i != /* ]]; then i=$PWD/$i; fi
      i=${i//\\/\\\\}; i=${i//$'\n'/$'\\\n'}
      printf '%s\n' "$i"
    done >> ~/.clipfiles
}

function Paste {
    while IFS= read src; do
      cp -Rdp "$src" .
    done < ~/.clipfiles
    rm ~/.clipfiles
}

Se podrían escribir mejores scripts para implementar esta idea, probé el mío y funciona muy bien para archivos y carpetas (¡¡No sé cómo xclippodría funcionar para copiar carpetas !!)


Por ejemplo:

/usr/local/dir1# Copy a.txt *.cpp
/usr/local/dir1# cd /usr/local/dir2
/usr/local/dir2# Paste

/usr/local/dir1# Copy *.h *.cpp b.txt subdir1
/usr/local/dir1# cd /usr/local/dir2
/usr/local/dir2# Paste

/usr/local/dir1# Copy a.txt b.txt 
/usr/local/dir1# cd /usr/local/dir2
/usr/local/dir2# Copy c.txt d.txt
/usr/local/dir2# cd /usr/local/dir3
/usr/local/dir3# Paste
saeedn
fuente
1
Esto funciona como un encanto!
Meysam
2
Me gusta esta idea. Y con pequeñas modificaciones, incluso podría implementar una función de "corte" también.
Pablo Venturino
@Gilles podría explicar por qué se ha sustituido echocon printf?
Meysam
@Meysam Para trabajar incluso debajo shopt -s xpg_echo.
Gilles 'SO- deja de ser malo'
1
@Meysam printfes portátil y seguro mientras echoque no lo es. El wiki de Wooledge menciona esto brevemente.
jw013
10

Sugiero xclip. Lo uso todo el tiempo para esto. pero no necesitas un script solo usa funciones.

No veo la necesidad de usar estos scripts, en particular, porque si está haciendo lo que creo que está haciendo, encontrará los scripts ya mencionados (en el útil blog de linux tidbits) molestos porque le solicitan que ingrese siempre que sea posible , solo usarlos, contrario a la filosofía de Unix.

Sugiero escribir algunas funciones en su .bashrc:

clip2file () {
  xclip -out -selection clipboard >> $@
  echo -e "\n" >> $@
}

file2clip () {
  cat $@ | xclip -selection clipboard
}

para usarlos, necesita apt-get install xclip(Debian, Ubuntu, Linux Mint, etc.) o zypper in xclip(openSUSE, otros sistemas basados ​​en .rpm) o algún equivalente. el programa debería estar disponible en cualquier sistema que esté utilizando.

ixtmixilix
fuente
3

Puedes usar el xclipcomando para esto. Puede descargar scripts de bash desde este enlace y colocar alias para bash cp2clipy bash clippasteen su .bashrcarchivo.

harish.venkat
fuente
@ ¿Qué quieres decir con alias?
ixtmixilix
Me refería a mantener los archivos en su directorio de inicio y poner dos alias en su alias .bashrc cp2clip = 'bash / home / <username> /cp2clip.sh' y clippaste = 'bash / home / <username> /clippaste.sh' así que Puedes usarlos en cualquier lugar. Para leer más sobre los alias, puede ver man aliaso linfo.org/alias.html
harish.venkat