використовуючи термінал для копіювання файлу в буфер обміну


159

У мене файл на робочому столі, ім'я файлу ded.html. Щоб скопіювати файл, натисніть на файл і натисніть cmd + c.

Тепер, як би я зробив те саме, використовуючи термінал?


2
Ви маєте на увазі скопіювати файл або скопіювати вміст файлу, щоб вміст можна було вставити?
користувач151019

Також дивіться apple.stackexchange.com/q/362245/10713
laktak

Відповіді:


237

Якщо я правильно розумію питання, те, що ви хочете, це pbcopyі є pbpaste.

Відкрийте термінал і виконайте:

$ cat ~/Desktop/ded.html | pbcopy

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

Щоб помістити його десь в іншому місці, тобто вставити його, виконайте:

$ pbpaste > ~/Documents/ded.html

Тепер у вас повинна бути копія ded.html, що знаходиться в ~ / Документах.


3
Це чудово підходить для роботи з текстовими файлами, але не вдасться, коли ви спробуєте виконати завдання з бінарними файлами. Спробуйте це із зображенням, щоб побачити, що я маю на увазі.
Itai Ferber

7
після введення $ cat ~ / Desktop / ded.html | pbcopy Я не можу використовувати cmd + v для вставки файлу. Все-таки $ pbpaste> ~ / Документи / ded.html зробив цю роботу.
сердитий ківі

Ви також можете переглянути вміст файлів у буфері обміну OSX, перейшовши через меню Finder Правка> Показати буфер обміну (перевірено в Yosemite).
Даннід

Дякую, будь-яка ідея, як я це прочитав і передав це наступній команді? наприклад cat ~/.emulator_console_auth_token | auth <read_content>?
Домінік

При цьому копіюється вміст файлу, але не сам файл.
vy32

20

Відповідь Лрі спрямовується в правильному напрямку, але вона має кілька недоліків: немає необхідності використовувати Finder ( the clipboardє частиною StandardAdditions OSAX), а надання 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 також може бути використаний як інтерпретатор хеш- бангу (починаючи з 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, ви можете опустити шлях до файлу «скрипт».


@Lri: Finder не розуміє очевидного set the clipboard to {one,two}(хоча інша програма AppleScript може успішно витягти список). Команди буфера обміну StandardAdditions можуть бути обмежені одними елементами.
Кріс Джонсен

1
Це буде працювати для декількох файлів?
ВіталійБ

Примітка. Наведений шлях повинен бути абсолютним шляхом для роботи сценарію.
Лев

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
Чи може ОП досягти того, що вони хочуть, за допомогою 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: повернено до версії, яка підтримує відносні шляхи.


2
Цей насправді працює!
Бемму

6

pbcopy < filenameКоманда виконання у терміналі копіює вміст названого файлу filename.


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

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 файлами.


-2

Ви можете використовувати cat 'originfile'> 'targetfile' в unix середовищах;

Скопіювати originfile цільовий файл на Windows.


2
Як це розмістити файл у буфері обміну?
гр
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.