za pomocą terminala skopiować plik do schowka

159

Mam plik na pulpicie, nazwa pliku to ded.html. Aby skopiować plik, klikam plik i naciskam cmd + c.

Jak teraz zrobiłbym to samo przy użyciu terminalu?

zły kiwi
źródło
2
Czy masz na myśli skopiowanie pliku czy skopiowanie zawartości pliku, aby zawartość mogła zostać wklejona?
user151019,

Odpowiedzi:

237

Jeśli dobrze rozumiem pytanie, to, czego szukasz, to pbcopyi pbpaste.

Otwórz terminal i wykonaj:

$ cat ~/Desktop/ded.html | pbcopy

Teraz ten plik jest w schowku.

Aby umieścić go w innym miejscu, to znaczy wkleić, wykonaj:

$ pbpaste > ~/Documents/ded.html

Teraz powinieneś mieć kopię pliku ded.html siedzącego w ~ / Documents.

boehj
źródło
3
Jest to świetne do pracy z plikami tekstowymi, ale zawiedzie, gdy spróbujesz wykonać zadanie z plikami binarnymi. Wypróbuj to z obrazem, aby zobaczyć, co mam na myśli.
Itai Ferber
7
po wpisaniu $ cat ~ / Desktop / ded.html | pbcopy Nie mogę użyć cmd + v do wklejenia pliku. Chociaż $ pbpaste> ~ / Documents / ded.html wykonało zadanie.
zły kiwi
Możesz także wyświetlić zawartość pliku w schowku OSX, przechodząc przez menu Findera Edycja> Pokaż schowek (testowane w Yosemite).
Dannid,
Dzięki, masz pomysł, jak to odczytać i przekazać do następnego polecenia? na przykład cat ~/.emulator_console_auth_token | auth <read_content>?
Dominic
Spowoduje to skopiowanie zawartości pliku, ale nie samego pliku.
vy32
20

Odpowiedź Lri zmierza we właściwym kierunku, ale ma kilka wad: nie ma potrzeby używania Findera ( the clipboardjest częścią StandardAdditions OSAX), a podanie programu runobsługi jest znacznie bardziej niezawodnym sposobem przekazywania argumentów z wiersza poleceń (od 10.4). Dokonanie obu tych zmian znacznie upraszcza „ucieczkę”, którą należy zrobić, aby wejść do programu w powłoce.

Oto moja wersja (zapakowana w funkcję powłoki - możesz ją umieścić (np.) Swoją, .bashrcaby była dostępna w swoich powłokach):

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

Plik, który został umieszczony w schowku za pomocą tego skryptu, można następnie wkleić w Finderze, aby skopiować plik do innego folderu.

osascript może być również używany jako interpreter hash-bang (od 10.5). Umieść to w pliku (np. file-to-clipboard)

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

Ustaw plik jako wykonywalny ( chmod +x /path/to/where/ever/you/put/file-to-clipboard). Następnie uruchom go tak:

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

Jeśli jest przechowywany w katalogu w ścieżce, możesz pominąć ścieżkę do pliku „skryptowego”.

Chris Johnsen
źródło
@Lri: Finder nie rozumie oczywistości set the clipboard to {one,two}(chociaż inny program AppleScript może pomyślnie wyodrębnić listę). W StandardAdditions schowka polecenia mogą być ograniczone do pojedynczych elementów.
Chris Johnsen
1
Czy działałoby to w przypadku wielu plików?
VitalyB
Uwaga: Podana ścieżka musi być bezwzględną ścieżką do działania skryptu.
Lew
8

Nie ma sposobu, aby osiągnąć to, co próbujesz zrobić za pomocą wiersza polecenia. Chociaż Apple oferuje narzędzia pbcopyi pbpastepozwalające na podstawowe kopiowanie tekstu, nie możesz używać tych narzędzi do kopiowania pliku w takim znaczeniu, w jakim szukasz.

Bez wchodzenia w zbyt szczegółowe szczegóły techniczne, kiedy „kopiujesz” plik w Finderze za pomocą C, tak naprawdę nie kopiujesz samego pliku, tylko czyniąc odniesienie do pliku w schowku i oznaczając go jako odwołanie do pliku. Kiedy aplikacja otrzymuje to odniesienie podczas wklejania, ma obowiązek uporządkowania, znalezienia wklejonych elementów i ostatecznie pracy z plikiem, który uzna za odpowiedni. W istocie, gdy kopiujesz plik w Finderze, zapisuje on ścieżkę do pliku w określony sposób do określonego schowka, a po wklejeniu otrzymuje ścieżkę do pliku i wie, jak utworzyć nowy plik przy użyciu zawartości stary (skopiuj plik do schowka, usuń go, spróbuj wkleić go gdzie indziej i na przykład zobacz, co się stanie).

W tym sensie kopiowania i wklejania dostępne narzędzia nie wystarczą, aby zrobić to, czego potrzebujesz. Jak sugerował boehj, możesz spróbować skopiować zawartość starego pliku do nowego, ale będzie to działać dobrze tylko w przypadku plików tekstowych. Wszystkie otrzymane pliki binarne zostaną uszkodzone (spróbuj zrobić to z obrazem - zostanie uszkodzony).

Tradycyjny wiersz poleceń zawiedzie Cię w ten sposób, ale możesz rzucić okiem, jeśli chcesz to zrobić w AppleScript, a następnie wywołać to za pomocą wiersza polecenia osascript.

Itai Ferber
źródło
Masz rację co do obrazów itp. Nie myślałem o tym. Wydaje mi się, że źle zrozumiałem pytanie, ponieważ chociaż pbcopyi pbpastebędę działać z plikiem .html, to tylko dlatego, że akurat jest to plik tekstowy.
boehj
Nie, dobrze zrozumiałeś pytanie, po prostu założyłeś, że te narzędzia działały tak, jak powinny, a nie. Są błędne i nawet nie mają tak działać, chociaż Apple wykonało naprawdę kiepską pracę nad dokumentacją. Jeśli wpiszesz pbcopy -help, otrzymasz NSLog()powtarzającą się linię, która nie jest warta produkcji 'pbcopy -help'. Zrozumienie tego pomaga być programistą i dlatego czułem, że trzeba wejść.
Itai Ferber
1
Tak, nie ma problemu. ;)
Itai Ferber
1
Każdy, kto chce zwrócić uwagę pbcopy, może uzyskać bezpłatne konto programisty i zgłosić kilka błędów - bugreport.apple.com - nie ma gwarancji, że to pomoże, ale daje inżynierom siłę, aby uzyskać czas na pracę nad tymi rzeczami, jeśli wystarczająca liczba osób nadal będzie dbać .
bmike
1
Czy OP może osiągnąć to, czego chcą, dzięki AppleScript na CLI?
7

Poniższa funkcja działa tylko z jednym plikiem, a nie z wieloma plikami. Wymaga GNU, readlinkktóry można zainstalować, uruchamiając brew install findutils.

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

Edycja: usunąłem tell app "Finder"blok.

Edycja 2: Przywrócono wersję, która obsługuje ścieżki względne.

Lri
źródło
2
Ten naprawdę działa!
Bemmu
6

Wykonanie pbcopy < filenamepolecenia w terminalu kopiuje zawartość pliku o nazwie filename.

shinxg
źródło
3

Aby skopiować plik do miejsca docelowego, użyj cppolecenia.

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

Zobacz man cpwięcej informacji.

Graham
źródło
2
To nie jest odpowiedź na zadane pytanie, które odwołuje się do schowka jako lokalizacji docelowej.
kellyfj
2

Oto prosty skrypt Shell / Bash. Po prostu wklej go do swojego .bashrcpliku (lub podobnego):

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

Przy wsparciu względnego pliku:

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

uruchom, clip_img path-to-fileaby skopiować obraz do schowka, i path-to-filemoże być względny. Plik może być plikiem JPEG lub PNG.

schemacs
źródło
-2

Możesz użyć cat 'originfile'> 'destinationfile' w środowiskach unix;

skopiuj plik docelowy pliku źródłowego w systemie Windows.

Allan Felipe Murara
źródło
2
Jak to umieszcza plik w schowku?
grg