在 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*here
或cutfiles 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
以下内容。cd
Meta-.Meta-./x
答案4
当您位于第一个目录时,让我们说源或src
简而言之,执行
src=${PWD}
然后cd
进入第二个目录并执行:
cp -i ${src}/filename .
该-i
选项会询问您是否要覆盖、是否有重复文件