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

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

在 Bash 中,假设我访问一个目录,然后访问另一个目录。我想将文件从第一个目录复制到第二个目录,但不指定它们的长路径名。是否可以?

我的临时解决方案是用作/tmp存储文件副本的临时位置。cp myfile /tmp当我在第一个目录中时,然后cp /tmp/myfile .当我在第二个目录中时。但我可以检查该文件是否会覆盖/tmp.

有没有类似剪贴板的东西可以复制和粘贴文件?

答案1

使用 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 ~-

答案2

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

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

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

编辑添加:

睡了一觉之后,我想知道我能与其他 GUI/操作系统行为有多接近,在这些行为中,您选择一些文件,“剪切”或“复制”它们,然后将它们“粘贴”到其他地方。我能想到的最好的选择机制是你的大脑/偏好加上 shell 的通配符功能。我对命名不太有创意,但这是基本思想(用 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; 破坏它们,或者您有权在“剪切”期间删除这些文件,或者您可以在移出后重新访问源目录的)。

答案3

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

如果您处于 emacs 模式,您可以cd从历史记录中调用您的命令,并Control-u使用进入bash“剪贴板”的行称为kill-ring(也有其他方法)。那么你可以猛拉随时将此字符串转换为新命令Control-y。显然,在您的示例中,这取决于您在命令中使用了绝对目录名称cd

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

答案4

当您位于第一个目录时,让我们说源或src简而言之,执行

src=${PWD}

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

cp -i ${src}/filename .

-i选项会询问您是否要覆盖、是否有重复文件

相关内容