используя терминал, чтобы скопировать файл в буфер обмена

158

Я получил файл на рабочем столе, имя файла ded.html. Чтобы скопировать файл, я нажимаю на файл и нажимаю cmd + c.

Теперь, как бы я сделал то же самое, используя терминал?

злой киви
источник
2
Вы хотите скопировать файл или скопировать его содержимое, чтобы его можно было вставить?
Марк
Также смотрите apple.stackexchange.com/q/362245/10713
Лактак

Ответы:

237

Если я правильно понял вопрос, то, что вы ищете, pbcopyи pbpaste.

Откройте терминал и выполните:

$ cat ~/Desktop/ded.html | pbcopy

Теперь этот файл находится в буфере обмена.

Чтобы поместить его в другое место, то есть вставить его, выполните:

$ pbpaste > ~/Documents/ded.html

Теперь у вас должна быть копия файла ded.html в ~ / Documents.

boehj
источник
3
Это отлично подходит для работы с текстовыми файлами, но потерпит неудачу при попытке выполнить задачу с помощью двоичных файлов. Попробуйте это с изображением, чтобы понять, что я имею в виду.
Итай Фербер
7
после ввода $ cat ~ / Desktop / ded.html | pbcopy Я не могу использовать cmd + v для вставки файла. Althought $ pbpaste> ~ / Documents / ded.html сделал свою работу.
злой киви
Вы также можете просмотреть содержимое файла в буфере обмена OSX, перейдя в меню Finder « Правка»> «Показать буфер обмена» (протестировано в Yosemite).
Даннид
Спасибо, есть идеи, как я прочитал это и передал это следующей команде? например cat ~/.emulator_console_auth_token | auth <read_content>?
Доминик
Это копирует содержимое файла, но не сам файл.
vy32
20

Ответ Лри направлен в правильном направлении, но у него есть пара недостатков: нет необходимости использовать Finder ( the clipboardявляется частью OSAX StandardAdditions ), а предоставление runобработчика является гораздо более надежным способом передачи аргументов из командной строки. (с 10.4). Выполнение обоих этих изменений значительно упрощает «экранирование», которое необходимо выполнить для входа в программу в оболочке.

Вот моя версия (обернутая в функцию оболочки - вы можете поместить ее (например, в свою), .bashrcчтобы сделать ее доступной в ваших оболочках):

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

Файл, который был помещен в буфер обмена с помощью этого сценария, затем можно вставить в Finder, чтобы скопировать файл в другую папку.

osascript также может использоваться в качестве интерпретатора hash-bang (начиная с 10.5). Поместите это в файл (например file-to-clipboard)

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

Сделайте файл исполняемым ( chmod +x /path/to/where/ever/you/put/file-to-clipboard). Затем запустите его так:

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

Если он хранится в каталоге в PATH, вы можете пропустить путь к файлу «script».

Крис Джонсен
источник
@Lri: Finder не понимает очевидного set the clipboard to {one,two}(хотя другая программа AppleScript может успешно извлечь список). В StandardAdditions буфер команды могут быть ограничены отдельными деталями.
Крис Джонсен
1
Будет ли это работать для нескольких файлов?
VitalyB
Примечание. Указанный путь должен быть абсолютным путем для работы скрипта.
Лев
8

Нет способа достичь того, что вы пытаетесь сделать, используя командную строку. Хотя Apple предлагает pbcopyи pbpasteинструменты , чтобы основное копирование текста, вы не можете использовать эти инструменты , чтобы скопировать файл в том смысле , что вы ищете.

Не вдаваясь в технические подробности, когда вы «копируете» файл в Finder C, вы на самом деле не копируете сам файл, а просто делаете ссылку на файл в буфере обмена и помечаете его как ссылку на файл. Когда приложение получает эту ссылку при вставке, оно отвечает за сортировку, выяснение того, что вы вставили, и, в конечном счете, за работу с файлом по своему усмотрению. По сути, когда вы копируете файл в Finder, он сохраняет путь к файлу определенным образом в определенном буфере обмена, а при вставке он получает этот путь к файлу и знает, как создать новый файл, используя содержимое файла. старый (скопируйте файл в буфер обмена, удалите его, попробуйте вставить его в другое место и посмотрите, что происходит, например).

В этом смысле копирования и вставки доступных инструментов недостаточно, чтобы делать то, что вам нужно. Как и предположил boehj, вы можете попытаться скопировать содержимое старого файла в новый, но это будет хорошо работать только для текстовых файлов. Любые двоичные файлы, которые вы получите, будут повреждены (попробуйте сделать это с изображением - оно станет поврежденным).

Традиционная командная строка провалит вас таким образом, но вы можете посмотреть, хотите ли вы сделать это в AppleScript, а затем вызвать это через командную строку с помощью osascript.

Итай Фербер
источник
Вы правы насчет образов и т. Д. Я не думал об этом. Я думаю, что я неправильно понял вопрос, потому что, хотя pbcopyи pbpasteбудет работать с файлом .html, это только потому, что это просто текстовый файл.
Boehj
Нет, вы правильно поняли вопрос, просто вы предполагали, что эти инструменты работают должным образом, а они - нет. Они ошибочны и даже не предназначены для такой работы, хотя Apple плохо справилась с документацией. Если вы наберете pbcopy -help, вы получите непроизводительную NSLog()строку, просто повторяющуюся 'pbcopy -help'. Это помогает быть программистом, чтобы понять это, поэтому я чувствовал, что необходимо вмешаться.
Итай Фербер
1
Да, нет проблем. ;)
Итай Фербер
1
Любой, кто хочет, чтобы pbcopy обратил на себя внимание, может получить бесплатную учетную запись разработчика и сообщить о некоторых ошибках - bugreport.apple.com - без гарантии, что это поможет, но это дает инженерам рычаг, чтобы получить время для работы над этими вещами, если все еще достаточно людей ,
bmike
1
Может ли OP достичь желаемого с помощью AppleScript в CLI?
7

Функция ниже работает только с одним файлом, а не с несколькими файлами. Требуется GNU, readlinkкоторый вы можете установить, запустив brew install findutils.

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

Изменить: я снял tell app "Finder"блок.

Редактировать 2: Возврат к версии, которая поддерживает относительные пути.

LRI
источник
2
Этот действительно работает!
Бемму
6

Выполнение pbcopy < filenameкоманды в Терминале копирует содержимое файла с именем filename.

shinxg
источник
3

Чтобы скопировать файл в место назначения, используйте cpкоманду.

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

Смотрите man cpдля получения дополнительной информации.

Грэхем
источник
2
Это не ответ на заданный вопрос, который ссылается на буфер обмена в качестве целевого местоположения.
kellyfj
2

Вот простой скрипт Shell / Bash. Просто вставьте его в свой .bashrcфайл (или тому подобное):

file-to-clipboard() {
    if [ -z "$1" ]; then
        echo "file path/name:"
        read FILE
    else
        FILE="$1"
    fi
    pbcopy < "$FILE"
}
blizzrdof77
источник
0

С поддержкой относительного файла:

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

запустить, clip_img path-to-fileчтобы скопировать изображение в буфер обмена, и path-to-fileможет быть относительным. Файл может быть в формате JPEG или PNG.

schemacs
источник
-2

Вы можете использовать cat 'originfile'> 'destinationfile' в среде unix;

скопировать файл оригинала на Windows.

Аллан Фелипе Мурара
источник
2
Как это поместить файл в буфер обмена?
grg