用于在命令行中复制和粘贴文件的剪贴板吗?


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,而不必忘记跳铁圈。
Deer Hunter

@PålGD人们说Emacs是一个操作系统...大多数都有剪贴板;)
Volker Siegel

@JeffSchaller谢谢.....................................-
蒂姆(Tim)

Answers:


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是示例。在现实世界中,通配符也可以用来简化复制任务。
Anderson Medeiros Gomes

2
我本来要提一些有关pushd和解析的事情dirs……但这远远好得多。我建议您添加一个事实,该事实"$OLDPWD"完全等效~-且更便于移植(对那些不使用bash。的用户有所帮助)
Wildcard

1
~+同样是"$PWD"
Paul Evans

11

如果我看到这种情况是一次性的,我可能会:

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

如果有目录我发现自己不定期复制文件,则可能会在.profile中为它们定义一些助记符变量。

编辑添加:

睡在它上面之后,我想知道我能与其他GUI / OS行为有多近的距离,在这里您可以选择一些文件,然后将它们“剪切”或“复制”,然后将它们“粘贴”到其他位置。我能想到的最佳选择机制是您的大脑/首选项以及外壳的globbing功能。我在命名方面不是很有创造力,但这是基本思想(使用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*herecutfiles glob*here。发生的所有事情是您的shell扩展了glob,并将这些文件名放入数组中。然后cd,您到达目标目录并运行pastefiles,该目录cp为每个源文件执行一个命令。如果您以前曾“剪切”文件,则pastefiles也会删除源文件(或尝试删除)。这不会对现有文件进行任何错误检查(在可能之前用cp; 破坏现有文件之前;或者您具有在“剪切”期间删除文件的权限;或者在移出后可以重新访问源目录)的)。


4
对于您的一次性产品,$OLDPWD已经存在,可以将其缩短为~-bash和zsh。
吉尔斯(Gillles)“所以-别再邪恶了”

5

我认为这~-是正确的答案,但请注意,bash具有内置的行编辑器,可以复制/粘贴文本。

如果你在emacs模式,你可以回想一下你cd从历史的命令,并使用Control-u行成bash的“剪贴板”叫杀环(还有其他的方式太)。然后,您可以抽出随时与此字符串转换成一个新的命令Control-y。显然,在您的示例中,这取决于您在cd命令中使用了绝对目录名称。

您还可以使用有趣的默认键绑定Meta-.。这会将上一个命令的最后一个单词复制到您的当前行中。如果重复,则每次返回历史记录中的一个命令。因此,如果您执行cd /x,那么cd /y接下来cdMeta-.Meta-.您将需要/x输入。


5

通过扩展来自Anderson M. Gomes的答案,Bash允许您通过键入~N(或~+NNdir堆栈中的位置来引用目录堆栈中的任何先前目录。例如:

# 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手册页的本部分


4

当您在第一个目录中时,假设源代码或src简而言之,执行

src=${PWD}

然后cd进入第二个目录并执行:

cp -i ${src}/filename .

-i选项将询问您是否要覆盖,是否存在重复文件


谢谢。不指定文件名则更好。
蒂姆(Tim)2013年

4

Anderson-m-Gomes回应的一种变体。使用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。同样,不幸的是,变量扩展不能使制表符完成。但是,在键入$ OLDPWD部分之后,您可以使用ctrl-alt-e对当前命令行进行shell扩展。
彼得·科德斯

1
~-是捷径$OLDPWD
Gilles'SO-别再成为邪恶

我只是指出了另一种变化,因为Unix / Linux充满了它们。有趣的是,我使用Linux已有20多年了,以前从未见过〜-。另外,$ OLDPWD很容易记住。
斯科特·卡尔森,

3

如果是bash,我将使用pushdpopd。这些命令保留了方便的目录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,Kinda笨拙,并且不能一概而论地建立符号链接或硬链接。(cp -ascp -al
彼得·科德斯

1

您可以在clipboard-files此处签出脚本:https : //github.com/larspontoppidan/clipboard-files

它提供诸如和的命令ccopy,这些命令使用桌面环境剪贴板,并允许直观地复制/粘贴文件:ccutcpaste

ccopy myfile
cd <second directory>
cpaste

使用桌面环境剪贴板时,复制/粘贴将与其他程序(例如文件管理器和IDE)中放置在剪贴板上的文件进行交互。至少它可以在类似Gnome的桌面上使用。

完全公开后,我放弃了在那找到类似的东西后写了剧本...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.