utiliser terminal pour copier un fichier dans le presse-papier

159

J'ai un fichier sur le bureau, le nom du fichier est ded.html. Pour copier le fichier, je clique sur le fichier et appuie sur cmd + c.

Maintenant, comment pourrais-je faire la même chose en utilisant un terminal?

kiwi en colère
la source
2
Voulez-vous dire copier le fichier ou copier le contenu du fichier afin que le contenu puisse être collé?
user151019

Réponses:

237

Si je comprends bien la question, ce que vous recherchez est pbcopyet pbpaste.

Ouvrez un terminal et faites:

$ cat ~/Desktop/ded.html | pbcopy

Maintenant, ce fichier est dans le presse-papier.

Pour le mettre ailleurs, c'est-à-dire pour le coller, faites:

$ pbpaste > ~/Documents/ded.html

Vous devriez maintenant avoir une copie de ded.html dans ~ / Documents.

boehj
la source
3
C'est très bien pour travailler avec des fichiers texte, mais cela échouera si vous essayez d'exécuter la tâche avec des fichiers binaires. Essayez ceci avec une image pour voir ce que je veux dire.
Itai Ferber
7
après avoir tapé $ cat ~ / Desktop / ded.html | pbcopy je ne peux pas utiliser cmd + v pour coller le fichier. Althought $ pbpaste> ~ / Documents / ded.html a fait le travail.
Kiwi en colère
Vous pouvez également afficher le contenu du fichier dans votre presse-papiers OSX en passant par le menu Finder Edition> Afficher le presse-papiers (testé dans Yosemite).
Dannid
Merci, avez-vous une idée de la façon dont je l'ai lu et transmis à la commande suivante? par exemple cat ~/.emulator_console_auth_token | auth <read_content>?
Dominic
Cela copie le contenu du fichier, mais pas le fichier lui-même.
vy32
20

La réponse de Lri va dans la bonne direction, mais elle présente quelques défauts: il n’est pas nécessaire d’utiliser Finder ( the clipboardfait partie de StandardAdditions OSAX) et donner un rungestionnaire est un moyen beaucoup plus fiable de passer des arguments depuis la ligne de commande. (depuis 10.4). Ces deux modifications simplifient grandement les «échappées» nécessaires pour entrer dans le programme dans un shell.

Voici ma version (encapsulée dans une fonction shell - vous pouvez l'insérer dans (par exemple, votre .bashrcpour la rendre disponible dans vos 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 fichier qui a été placé dans le Presse-papiers avec ce script peut ensuite être collé dans le Finder pour copier le fichier dans un autre dossier.

osascript peut également être utilisé comme interprète de hash-bang (à partir de 10.5). Mettre ceci dans un fichier (par exemple file-to-clipboard)

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

Rendre le fichier exécutable ( chmod +x /path/to/where/ever/you/put/file-to-clipboard). Puis lancez-le comme ceci:

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

S'il est stocké dans un répertoire du chemin PATH, vous pouvez omettre le chemin du fichier «script».

Chris Johnsen
la source
@Lri: le Finder ne comprend pas l'évidence set the clipboard to {one,two}(bien qu'un autre programme AppleScript puisse extraire la liste avec succès). Les commandes du Presse-papiers StandardAdditions peuvent être limitées à des éléments uniques.
Chris Johnsen
1
Cela fonctionnerait-il pour plusieurs fichiers?
VitalyB
Remarque: Le chemin indiqué doit être un chemin absolu pour que le script fonctionne.
Leo
8

Il n'y a aucun moyen de réaliser ce que vous essayez de faire en utilisant la ligne de commande. Bien qu'Apple propose les outils pbcopyet pbpastepermettant la copie de base de texte, vous ne pouvez pas utiliser ces outils pour copier un fichier dans le sens que vous recherchez.

Sans trop entrer dans les détails techniques, lorsque vous "copiez" un fichier dans le Finder en utilisant C, vous ne copiez pas le fichier lui-même, vous faites simplement référence au fichier dans le presse-papiers et vous le marquez comme une référence de fichier. Lorsqu'une application reçoit cette référence lorsque vous la collez, elle a la responsabilité de trier les éléments, de déterminer ce que vous avez collé et, en définitive, de travailler avec le fichier à votre guise. En substance, lorsque vous copiez un fichier dans le Finder, il enregistre le chemin du fichier d’une certaine manière vers un certain presse-papiers, et lorsque vous collez, il reçoit ce chemin et sait créer un nouveau fichier en utilisant le contenu du fichier. ancien (copiez un fichier dans le presse-papiers, supprimez-le, essayez de le coller ailleurs et voyez ce qui se passe, par exemple).

Dans ce sens de copier-coller, les outils disponibles ne suffisent pas pour faire ce dont vous avez besoin. Comme suggéré par boehj, vous pouvez essayer de copier le contenu de l'ancien fichier dans un nouveau, mais cela ne fonctionnera que pour les fichiers texte. Tous les fichiers binaires que vous obtiendrez seront corrompus (essayez de le faire avec une image - elle sera corrompue).

La ligne de commande traditionnelle vous échouera de cette manière, mais vous pouvez jeter un coup d'œil si vous souhaitez le faire dans AppleScript, puis l'invoquer via la ligne de commande avec osascript.

Itai Ferber
la source
Vous avez raison en ce qui concerne les images, etc. Je n'y ai pas pensé. Je suppose que j'ai mal compris la question, car même si pbcopyet pbpastefonctionnera avec un fichier .html, c'est uniquement parce qu'il se trouve qu'il s'agit simplement d'un fichier texte.
Boehj
Non, vous avez bien compris la question, vous avez simplement supposé que ces outils fonctionnaient comme ils le devraient, ce qu'ils ne font pas. Ils sont buggés et ne sont même pas censés fonctionner de cette façon, même si Apple a fait un travail vraiment médiocre en matière de documentation. Si vous tapez pbcopy -help, vous obtenez une NSLog()ligne ne répétant pas la production 'pbcopy -help'. C’est bien pour un programmeur de comprendre cela, c’est pourquoi j’ai jugé nécessaire d’intervenir.
Itai Ferber Le
1
Oui, pas de problème. ;)
Itai Ferber
1
Quiconque souhaite attirer l'attention de pbcopy peut obtenir un compte développeur gratuit et archiver quelques bogues - bugreport.apple.com - rien ne garantit que cela aidera, mais cela donne aux ingénieurs suffisamment de temps pour travailler sur ces éléments si suffisamment de personnes sont concernées. .
bmike
1
Est-ce que l'OP peut réaliser ce qu'il veut avec AppleScript sur la CLI?
7

La fonction ci-dessous ne fonctionne qu'avec un seul fichier et non avec plusieurs fichiers. Il nécessite GNU readlinkque vous pouvez installer en exécutant brew install findutils.

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

Edit: j'ai supprimé le tell app "Finder"bloc.

Edit 2: Revenez à une version qui prend en charge les chemins relatifs.

Lri
la source
2
Celui-ci fonctionne réellement!
Bemmu
6

L'exécution de la pbcopy < filenamecommande dans le terminal copie le contenu du fichier nommé filename.

shinxg
la source
3

Pour copier un fichier dans une destination, utilisez la cpcommande.

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

Voir man cppour plus d'informations.

Graham
la source
2
Ce n’est pas une réponse à la question posée qui fait référence au presse-papiers en tant qu’emplacement cible.
kellyfj
2

Voici un script Shell / Bash simple. Il suffit de le coller dans votre .bashrcfichier (ou similaire):

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

Avec support de fichier relatif:

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'
}

exécuter clip_img path-to-filepour copier l'image dans le presse-papier, et path-to-filepourrait être relatif. Le fichier peut être un fichier jpeg ou png.

schemacs
la source
-2

Vous pouvez utiliser cat 'originfile'> 'destinationfile' sur les environnements Unix;

copier le fichier de destination du fichier d'origine sur Windows.

Allan Felipe Murara
la source
2
Comment cela place-t-il le fichier dans le presse-papiers?
grg