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

25

Предположим, в Bash я захожу в каталог, а затем в другой каталог. Я хотел бы скопировать файл из первого каталога во второй каталог, но без указания длинных путей к ним. Является ли это возможным?

Мое временное решение - использовать его /tmpкак временное место для хранения копии файла. cp myfile /tmpкогда я нахожусь в первом каталоге, а затем, cp /tmp/myfile .когда я нахожусь во втором каталоге. Но я могу проверить, будет ли файл перезаписывать что-либо в /tmp.

Есть ли что-то похожее на буфер обмена для копирования и вставки файла?

Тим
источник
1
Вы должны ввести cdкоманду, чтобы вы могли просто cd -вернуться в предыдущий каталог, нажать стрелку вверх, чтобы вызвать cdкоманду, и отредактировать строку cpвместо cd. (ctrl-a (начало строки), alt-d (kill-word) cp -a, ctrl-e (конец строки)).
Питер Кордес
С Emacs и M-x termвы можете использовать буфер обмена Emacs.
Пол 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 лет, и я не знал этого ярлыка.
Dubu
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, где вы выбираете некоторое количество файлов, «вырезаете» или «копируете» их, а затем «вставляете» их в другое место. Лучшим механизмом выбора, который я мог придумать, был ваш мозг / предпочтения плюс функция оболочки. Я не очень креативен с именами, но это основная идея (в синтаксисе Bash):

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команду для каждого исходного файла. Если вы ранее «вырезали» файлы, то pastefiles также удаляет исходный файл (или пытается). Это не делает никакой проверки ошибок (существующих файлов, до того, как они могут быть захлопнуты;; cpили что у вас есть разрешения на удаление файлов во время «вырезания», или что вы можете повторно получить доступ к исходному каталогу после того, как вы выйдете этого).

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

Я думаю, что ~-это правильный ответ, но учтите, что в bash есть встроенный редактор строк, который может копировать / вставлять текст.

Если вы находитесь в режиме emacs, вы можете вызвать свою cdкоманду из истории и использовать ее Control-uдля уничтожения строки в «буфере обмена» bash, называемом kill-ring (есть и другие способы). Затем вы можете в любой момент вернуть эту строку в новую команду с помощью Control-y. Очевидно, в вашем примере это зависит от того, использовали ли вы в своей cdкоманде абсолютное имя каталога .

Вы также можете использовать интересное связывание ключей по умолчанию Meta-.. Это копирует последнее слово из предыдущей команды в вашу текущую строку. При повторении каждый раз возвращается одна команда в истории. Так что, если вы сделаете cd /x, а cd /yзатем cdMeta-.Meta-.вы будете иметь /xв своем входе.

meuh
источник
5

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

# 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 .

С большим набором файлов вы можете перечислить их имена в файле манифеста, а затем сделать копию из исходного каталога:

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

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

Смотрите также: этот раздел справочной страницы Bash


Аналогично, в Tcsh вы можете использовать =2нотацию (а не ~2) для ссылки на второй каталог в вашем стеке каталогов .

Смотрите также: этот раздел справочной страницы Tcsh

jskroch
источник
4

когда вы находитесь в первом каталоге, скажем, источник или srcвкратце, выполнить

src=${PWD}

затем cdво второй каталог и выполните:

cp -i ${src}/filename .

-iвариант будет спросить , если вы хотите переписать, если есть дубликат файл

MelBurslan
источник
Спасибо. Это даже лучше без указания имени файла.
Тим
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
Жиль "ТАК - перестать быть злым"
Я просто указал на другой вариант, так как в Unix / Linux их полно. Забавно, что я использую Linux более 20 лет, и я никогда не видел ~ - раньше. Кроме того, $ OLDPWD легко запомнить.
Скотт Карлсон
3

Если бы в bash, я бы использовал pushd и popd . Эти команды хранят удобный каталог FIFO для последующего использования. Вы можете обратиться к стеку в любое время, используя каталоги .

Как таковой я бы сделал:

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 .

Pandya
источник
Это делает 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-подобных рабочих столах.

Полное раскрытие, я написал сценарий после того, как бросил находить что-то подобное там ...

Larsp
источник