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


25

Припустимо, в Bash я відвідую каталог, а потім інший каталог. Я хотів би скопіювати файл з першого каталогу у другий каталог, але не вказуючи довгі назви їх. Це можливо?

Моє тимчасове рішення - використовувати /tmpяк тимчасове місце для зберігання копії файлу. cp myfile /tmpколи я перебуваю в першому каталозі, а потім, cp /tmp/myfile .коли я перебуваю у другому каталозі. Але я можу перевірити, чи файл замінить щось /tmp.

Чи є щось подібне до буфера обміну для копіювання та вставлення файлу?


1
Ви повинні ввести cdкоманду, так що ви можете просто cd -повернутися до попереднього каталогу, стрілка вгору, щоб пригадати cdкоманду, і відредагувати рядок, який буде cpзамість cd. (ctrl-a (початок рядка), alt-d (слово вбивства) cp -a, ctrl-e (кінець рядка)).
Пітер Кордес

З Emacs і M-x termви можете використовувати буфер обміну Emacs.
Pål GD

1
Ви можете використовувати Midnight Commander і забути про стрибки через обручі.
Мисливець на оленів

@ PålGD Люди кажуть, що Emacs - це операційна система ... Більшість мають буфери обміну;)
Volker Siegel

@JeffSchaller дякую ................................
Тім

Відповіді:


59

Використовуючи Bash, я б просто завітав у каталоги:

$ cd /path/to/source/directory
$ cd /path/to/destination/directory

Потім я б скористався ярликом ~-, який вказує на попередній каталог:

$ cp -v ~-/file1.txt .
$ cp -v ~-/file2.txt .
$ cp -v ~-/file3.txt .

Якщо ви хочете відвідувати каталоги в зворотному порядку, то:

$ cp -v fileA.txt ~-
$ cp -v fileB.txt ~-
$ cp -v fileC.txt ~-

25
+1 Я використовую оболонки Unix / Linux вже більше 20 років, і я не знав цього ярлика.
Дубу

4
Так, це зручна комбінація клавіш "$OLDPWD". Чому три окремі cpкоманди, хоча? cp -a ~-/file[1-3].txt .
Пітер Кордес

4
Власне, трійка cpє прикладами. У реальному світі символи підстановки також можуть використовуватися для спрощення завдання копіювання.
Андерсон Медейрос Гомес

2
Я збирався згадати щось про pushdта розбору dirs... але це далеко, набагато краще. Я пропоную вам додати той факт, який "$OLDPWD"точно еквівалентний ~-і є більш портативним (корисно для тих, хто не використовує bash)
Wildcard

1
~+це також ярлик для"$PWD"
Пол Еванс

11

Якби я бачив, що ситуація стає одноразовою, я можу:

a=`pwd`
cd /somewhere/else
cp "$a/myfile" .

Якби були каталоги, за якими я можу копіювати файли з періодичної регулярності, я, мабуть, визначив деякі мнемонічні змінні для них у своєму .profile.

Відредаговано, щоб додати:

Після сну на ньому я задумався, наскільки тісно я можу потрапити до інших форм поведінки GUI / OS, де ви вибираєте деяку кількість файлів, "вирізаєте" чи "копіюєте" їх, а потім "вставляєте" їх десь ще. Найкращий механізм відбору, який я міг би придумати, - це ваш мозок / уподобання плюс функція обшивки оболонки. Я не дуже креативний в іменуванні, але це основна ідея (у синтаксисі Баша):

function copyfiles {
  _copypastefiles=("$@")
  _copypastesrc="$PWD"
  _copypastemode=copy
}

function cutfiles {
  _copypastefiles=("$@")
  _copypastesrc="$PWD"
  _copypastemode=cut
}

function pastefiles {
  for f in "${_copypastefiles[@]}"
  do
    cp "${_copypastesrc}/$f" .
    if [[ ${_copypastemode} = "cut" ]]
    then
      rm "${_copypastesrc}/$f"
    fi
  done
}

Щоб використовувати його, покладіть код у ~ / .bash_profile, потім cdу вихідний каталог та запустіть або copyfiles glob*hereабо cutfiles glob*here. Все, що трапляється, це те, що ваша оболонка розширює глобус і поміщає ці назви файлів у масив. Потім ви перейдете cdдо каталогу призначення та запустіть pastefiles, який виконує cpкоманду для кожного вихідного файлу. Якщо ви раніше "вирізали" файли, то пасти також видаляє вихідний файл (або, намагається). Це не робить перевірки помилок (для існуючих файлів, перш ніж потенційно їх виправити cp, або що у вас є дозволи на видалення файлів під час "вирізання"), або що ви можете повторно отримати доступ до вихідного каталогу після того, як ви вийдете з неї).


4
Для вашого одноразового $OLDPWDвже існує, яке можна скоротити ~-в bash і zsh.
Жил "ТАК - перестань бути злим"

5

Я думаю, що ~-це правильна відповідь, але зауважте, що в bash є вбудований редактор рядків, який може копіювати / вставляти текст.

Якщо ви перебуваєте в режимі Emacs ви можете згадати вашу cdкоманду з історії, і використовувати Control-uдля вбивання рядка в баш "буфер обміну" під назвою kill-ring (є й інші способи). Потім ви можете в будь-який час перетягнути цей рядок у нову команду Control-y. Очевидно, що у вашому прикладі це залежить від того, що ви використовували абсолютне ім’я каталогу у своїй cdкоманді.

Ви також можете використовувати цікаву прив'язку ключів за замовчуванням Meta-.. Це копіює останнє слово з попередньої команди у поточний рядок. Якщо повторюється, кожен раз повертається одна команда в історії. Отже, якщо ви зробите це cd /x, то cd /yслідуючи за cdMeta-.Meta-.вами, ви матимете /xсвій внесок.


5

Розгортаючи відповідь від Андерсона М. Гомеса , Bash дозволяє звертатися до будь-якого попереднього каталогу у вашому стеку каталогів, ввівши ~N(або ~+N) де Nпозиція на стеку dir. Наприклад:

# go some places
$ cd /path/to/source/directory
$ pushd /path/to/destination/directory
$ pushd $HOME
$ pushd /tmp

# show the current dir stack
$ dirs -v
0 /tmp
1 ~
2 /path/to/destination/directory
3 /path/to/source/directory

Тепер ви можете скопіювати файл між двома минулими каталогами, жоден з них не поточним, за допомогою:

cp -v ~3/file1.txt ~2

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

$ cd /path/to/source/directory
$ pushd /path/to/destination/directory

# show the current dir stack
$ dirs -v
0 /path/to/destination/directory
1 /path/to/source/directory

# copy
cp -v ~1/file[123].txt .

З великим набором файлів ви можете перелічити їх імена у файлі маніфесту, а потім зробити копію з вихідного dir:

$ cd /path/to/destination/directory
$ pushd /path/to/source/directory

# copy
cp -v $(cat files_to_copy.list) ~1

Дивіться також: цей розділ сторінки чоловіка Баша


Аналогічно в Tcsh ви можете використовувати =2 позначення (а не ~2) для позначення другого dir на вашому стеку dir.

Дивіться також: цей розділ чоловічої сторінки Tcsh


4

коли ви знаходитесь в першому каталозі, давайте скажемо джерело або srcкоротше, виконайте

src=${PWD}

потім cdдо другого каталогу та виконайте:

cp -i ${src}/filename .

-iваріант буде запитати , якщо ви хочете переписати, якщо є дублікат файл


Спасибі. Ще краще, не вказуючи ім’я файлу.
Тим

4

Різниця у відповіді на Андерсон-м-гомеса. Використовуючи Bash, я б просто завітав у каталоги:

$ cd /path/to/source/directory
$ cd /path/to/destination/directory

Тоді я б використовував змінну $ OLDPWD, яка вказує на попередній каталог:

$ cp -v $OLDPWD/file1.txt .

Якщо ви хочете відвідувати каталоги в зворотному порядку, то:

$ cp -v fileA.txt $OLDPWD/

3
+1, але ви забули "процитувати" свої змінні розширення. Якщо $OLDPWDмістяться пробіли, це перерва. Також я завжди користуюся cp -a. Також прикро, що заповнення вкладки порушено на змінних розширеннях. Ви можете використовувати ctrl-alt-e для оболонки розширення поточного командного рядка, ввівши частину $ OLDPWD.
Пітер Кордес

1
~-- це ярлик для$OLDPWD
Жил "SO- перестань бути злим"

Я щойно вказував на іншу варіацію, оскільки Unix / Linux їх повна. Смішно, що я використовую Linux протягом 20 років, і ніколи не бачив ~ - раніше. Крім того, $ OLDPWD легко запам'ятовується.
Скотт Карлсон

3

Якщо в bash, я б використовував pushd і popd . Ці команди зберігають зручний FIFO стек каталогів для подальшого використання. Ви можете проконсультуватися зі стеком у будь-який час за допомогою dirs .

Як такий я би зробив:

pushd .
cd /somewhere/else
cp "`popd`/myfile"

2

Ви можете використовувати xclip:

NAME
       xclip - command line interface to X selections (clipboard)

SYNOPSIS
       xclip [OPTION] [FILE]...

DESCRIPTION
       Reads  from standard in, or from one or more files, and makes the data available as an X selection for pasting
       into X applications. Prints current X selection to standard out.

Приклад:

$ cd /path/to/dir1
$ xclip-copyfile file1 file2
$ cd /path/to/dir2
$ xclip-pastefile
file1 file2

Також відвідайте xsel .


Це робить tar | gzipвхід / вихід з буфера обміну X. Вигляд незграбний порівняно з cp, і не узагальнює створення символьних посилань або жорстких посилань. ( cp -asабо cp -al)
Пітер Кордес

1

Ви можете перевірити clipboard-filesсценарій тут: https://github.com/larspontoppidan/clipboard-files

Він надає команди, як ccopy, ccutі cpasteвикористовують буфер обміну для робочого столу та дозволяють інтуїтивно копіювати / вставляти файли:

ccopy myfile
cd <second directory>
cpaste

При використанні буфера обміну робочого столу копія / вставлення буде взаємодіяти з файлами, розміщеними в буфері обміну в інших програмах, таких як файлові менеджери та IDE. Принаймні, це працює на робочих столах, подібних до Gnome.

Повне розкриття, я написав сценарій, відмовившись від пошуку чогось подібного там ...

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