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


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.