usando terminal para copiar un archivo al portapapeles

159

Tengo un archivo en el escritorio, el nombre del archivo es ded.html. Para copiar el archivo, hago clic en el archivo y presiono cmd + c.

Ahora, ¿cómo haría lo mismo con el terminal?

kiwi enojado
fuente
2
¿Se refiere a copiar el archivo o copiar el contenido del archivo para poder pegarlo?
user151019

Respuestas:

237

Si entiendo bien la pregunta, lo que buscas es pbcopyy pbpaste.

Abra una terminal y haga:

$ cat ~/Desktop/ded.html | pbcopy

Ahora ese archivo está en el portapapeles.

Para ponerlo en otro lugar, es decir, para pegarlo, haga:

$ pbpaste > ~/Documents/ded.html

Ahora debería tener una copia de ded.html en ~ / Documentos.

boehj
fuente
3
Esto es ideal para trabajar con archivos de texto, pero fallará cuando intente realizar la tarea con binarios. Pruebe esto con una imagen para ver a qué me refiero.
Itai Ferber
77
después de escribir $ cat ~ / Desktop / ded.html | pbcopy No puedo usar cmd + v para pegar el archivo. Aunque $ pbpaste> ~ / Documents / ded.html hizo el trabajo.
Kiwi enojado
También puede ver el contenido del archivo en su portapapeles OSX yendo a través del menú Finder Editar> Mostrar portapapeles (probado en Yosemite).
Dannid
Gracias, ¿alguna idea de cómo lo leo y paso eso al siguiente comando? por ejemplo cat ~/.emulator_console_auth_token | auth <read_content>?
Dominic
Esto copia el contenido del archivo, pero no el archivo en sí.
vy32
20

La respuesta de Lri se dirige en la dirección correcta, pero tiene un par de fallas: no es necesario usar Finder ( the clipboardes parte del StandardAdditions OSAX), y dar un runcontrolador es una forma mucho más confiable de pasar argumentos desde la línea de comandos (desde 10.4). Realizar ambos cambios simplifica enormemente el "escape" que se debe hacer para ingresar al programa en un shell.

Aquí está mi versión (envuelta en una función de shell; puede poner esto en (por ejemplo) su .bashrcpara que esté disponible en sus shells):

file-to-clipboard() {
    osascript \
        -e 'on run args' \
        -e 'set the clipboard to POSIX file (first item of args)' \
        -e end \
        "$@"
}

file-to-clipboard ~/Desktop/ded.html

Un archivo que se ha colocado en el portapapeles con este script se puede pegar en Finder para copiar el archivo a otra carpeta.

osascript también se puede usar como intérprete de hash-bang (desde 10.5). Ponga esto en un archivo (por ejemplo file-to-clipboard)

#!/usr/bin/osascript
on run args
  set the clipboard to POSIX file (first item of args)
end

Hacer el archivo ejecutable ( chmod +x /path/to/where/ever/you/put/file-to-clipboard). Luego ejecútelo así:

/path/to/where/ever/you/put/file-to-clipboard ~/Desktop/ded.html

Si está almacenado en un directorio en la RUTA, puede omitir la ruta al archivo "script".

Chris Johnsen
fuente
@Lri: Finder no entiende lo obvio set the clipboard to {one,two}(aunque otro programa AppleScript puede extraer la lista con éxito). Los comandos del portapapeles StandardAdditions pueden estar limitados a elementos individuales.
Chris Johnsen
1
¿Funcionaría para múltiples archivos?
VitalyB
Nota: La ruta dada debe ser una ruta absoluta para que el script funcione.
Leo
8

No hay forma de lograr lo que intenta hacer con la línea de comando. Si bien Apple ofrece las herramientas pbcopyy pbpastepara permitir la copia básica de texto, no puede usar estas herramientas para copiar un archivo en el sentido que está buscando.

Sin entrar en demasiados detalles técnicos, cuando 'copia' un archivo en el Finder utilizando C, en realidad no está copiando el archivo en sí mismo, solo haciendo referencia al archivo en el portapapeles y marcándolo como referencia de archivo. Cuando una aplicación recibe esta referencia cuando la pega, tiene la responsabilidad de ordenar las cosas, averiguar lo que pegó y, en última instancia, trabajar con el archivo como mejor le parezca. En esencia, cuando copia un archivo en el Finder, guarda la ruta del archivo de cierta manera en un portapapeles determinado, y cuando pega, recibe esa ruta de archivo y sabe crear un nuevo archivo utilizando el contenido del archivo. anterior (copie un archivo en el portapapeles, elimínelo, intente pegarlo en otro lugar y vea qué sucede, por ejemplo).

En este sentido de copiar y pegar, las herramientas disponibles no son suficientes para hacer lo que necesita. Como sugirió boehj, puede intentar copiar el contenido del archivo antiguo en uno nuevo, pero esto solo funcionará bien para archivos de texto. Cualquier archivo binario que obtenga se dañará (intente hacer esto con una imagen; se corrompe).

La línea de comando tradicional le fallará de esta manera, pero puede echar un vistazo si desea hacerlo en AppleScript, luego invocarlo a través de la línea de comando con osascript.

Itai Ferber
fuente
Tienes razón sobre las imágenes, etc. No pensé en eso. Creo que he entendido bien la pregunta, porque si bien pbcopyy pbpasteva a trabajar con un archivo .html, eso es sólo porque le pasa a ser un archivo de texto.
boehj
No, entendiste la pregunta correctamente, es solo que asumiste que estas herramientas funcionaron como deberían, y no es así. Tienen errores, y ni siquiera están destinados a funcionar de esa manera, aunque Apple ha hecho un trabajo muy pobre en la documentación. Si escribe pbcopy -help, obtendrá una línea no digna NSLog()de producción que solo se repite 'pbcopy -help'. Es útil ser un programador para entender esto, por eso me pareció necesario intervenir.
Itai Ferber
1
Sí, no hay problema. ;)
Itai Ferber
1
Cualquiera que quiera que pbcopy obtenga atención puede obtener una cuenta de desarrollador gratuita y presentar algunos errores ( bugreport.apple.com) , no hay garantía de que ayude, pero les da a los ingenieros la oportunidad de trabajar en estas cosas si a suficientes personas todavía les importa .
bmike
1
¿Puede el OP lograr lo que quiere con AppleScript en la CLI?
7

La siguiente función solo funciona con un solo archivo y no con varios archivos. Requiere GNU readlinkque puede instalar ejecutando brew install findutils.

copy(){ osascript -e{'on run{a}','set the clipboard to posix file a',end} "$(greadlink -f -- "$1")";}

Editar: eliminé el tell app "Finder"bloque.

Edición 2: se revierte a una versión que admite rutas relativas.

Lri
fuente
2
¡Este realmente funciona!
Bemmu
6

El pbcopy < filenamecomando de ejecución en la Terminal copia el contenido del archivo nombrado filename.

shinxg
fuente
3

Para copiar un archivo a un destino, use el cpcomando.

cp /path/to/file /path/to/destination

Ver man cppara más información.

Graham
fuente
2
Esta no es una respuesta a la pregunta que hace referencia al portapapeles como la ubicación de destino.
kellyfj
2

Aquí hay un script simple de Shell / Bash. Solo pégalo en tu .bashrcarchivo (o similar):

file-to-clipboard() {
    if [ -z "$1" ]; then
        echo "file path/name:"
        read FILE
    else
        FILE="$1"
    fi
    pbcopy < "$FILE"
}
blizzrdof77
fuente
0

Con soporte de archivo relativo:

clip_img() {
    osascript -e 'on run argv' \
        -e 'set currentDir to do shell script "pwd"' \
        -e 'set the clipboard to (read POSIX file (POSIX path of (currentDir as text & (first item of argv) )) as JPEG picture)' \
        -e 'end run' "/$1"
    # osascript -e 'clipboard info'
}

ejecutar clip_img path-to-filepara copiar la imagen al portapapeles, y path-to-filepodría ser relativo. El archivo puede ser jpeg o png.

esquemas
fuente
-2

Puede usar cat 'originfile'> 'destinationfile' en entornos unix;

Copie el archivo de origen archivo de destino en Windows.

Allan Felipe Murara
fuente
2
¿Cómo coloca esto el archivo en el portapapeles?
grg