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

Tim*_*Tim 26 command-line bash command-history directory filenames

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

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

是否有类似于剪贴板的东西用于复制和粘贴文件?

And*_*mes 60

使用 Bash,我只会访问目录:

$ cd /path/to/source/directory
$ cd /path/to/destination/directory
Run Code Online (Sandbox Code Playgroud)

然后,我将使用~-指向上一个目录的快捷方式:

$ cp -v ~-/file1.txt .
$ cp -v ~-/file2.txt .
$ cp -v ~-/file3.txt .
Run Code Online (Sandbox Code Playgroud)

如果想以相反的顺序访问目录,则:

$ cp -v fileA.txt ~-
$ cp -v fileB.txt ~-
$ cp -v fileC.txt ~-
Run Code Online (Sandbox Code Playgroud)

  • +1 我使用 Unix/Linux shell 已经 20 多年了,但我不知道那个快捷方式。 (25认同)
  • 嗯,这是`"$OLDPWD"` 的便捷快捷方式。但是,为什么要使用三个单独的 `cp` 命令?`cp -a ~-/file[1-3].txt .` (4认同)
  • 实际上,三个`cp`就是例子。在现实世界中,还可以使用通配符来简化复制任务。 (4认同)
  • 我本来想提一些关于 `pushd` 和解析 `dirs` 的东西......但这要好得多。我建议你添加一个事实,即 `"$OLDPWD"` 完全等同于 `~-` 并且更便携(对那些不使用 `bash` 的人很有帮助。) (2认同)

Jef*_*ler 11

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

a=`pwd`
cd /somewhere/else
cp "$a/myfile" .
Run Code Online (Sandbox Code Playgroud)

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

编辑添加:

睡在上面之后,我想知道我能与其他 GUI/OS 行为有多接近,在这些行为中你选择一些文件,“剪切”或“复制”它们,然后将它们“粘贴”到其他地方。我能想到的最好的选择机制是你的大脑/偏好加上 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
}
Run Code Online (Sandbox Code Playgroud)

要使用它,请将代码放入 ~/.bash_profile,然后放入cd源目录并运行copyfiles glob*herecutfiles glob*here。所发生的一切就是您的 shell 扩展了 globs 并将这些文件名放入一个数组中。然后cd转到目标目录并运行pastefiles,它会cp为每个源文件执行一个命令。如果您之前“剪切”了文件,则 pastefiles 也会删除源文件(或尝试删除)。这不会进行任何错误检查(对现有文件,在可能用cp;破坏它们之前;或者您有权在“剪切”期间删除文件,或者您可以在移出后重新访问源目录其中)。

  • 对于一次性使用,`$OLDPWD` 已经存在,在 bash 和 zsh 中可以缩写为 `~-`。 (4认同)

meu*_*euh 5

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

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

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


jsk*_*och 5

扩展Anderson M. Gomes 的答案,Bash 允许您通过键入~N(或~+N) where Nis the position in the dir stack来引用目录堆栈中的任何先前目录。例如:

# 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
Run Code Online (Sandbox Code Playgroud)

现在你可以在两个过去的目录之间复制一个文件,它们都不是当前目录,使用:

cp -v ~3/file1.txt ~2
Run Code Online (Sandbox Code Playgroud)

要解决原始海报的问题,您可以执行以下操作:

$ 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 .
Run Code Online (Sandbox Code Playgroud)

对于大量文件,您可以在清单文件中列出它们的名称,然后从源目录进行复制:

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

# copy
cp -v $(cat files_to_copy.list) ~1
Run Code Online (Sandbox Code Playgroud)

另请参阅:Bash 手册页的这一部分


同样,在 Tcsh 中,您可以使用=2符号(而不是~2)来引用目录堆栈中的第二个目录。

另请参阅:Tcsh 手册页的这一部分