假设我在某个目录(例如 home)下有一个这样的路径:~/mydir/subdir/file1
,并且我想复制文件1:
我们可以从主目录执行此操作:
cp ~/mydir/subdir/file1 ~/mydir/subdir/file2
是否有一个快捷方式表示“与源在同一路径中”,这样我就不必mydir/subdir
再次重复该部分,就像.
表示当前目录一样?或者另一种方法可以达到相同的结果?
我知道我可以cd ~/mydir/subdir
先,但我正在寻找一种单行解决方案,可以让我保留在同一目录中。一种选择是使用变量,但我希望在输入大量命令时有一种更优雅的方式。
在网上查看man cp
并搜索但找不到这样的选项。如果答案是明确的“否”,那也没关系,我只是想检查一下其他人是否使用了节省时间的技巧。谢谢!
答案1
使用bash
(1),并假设路径没有空格或换行(2),我会使用
cp ~/mydir/subdir1/{file1,file2}
这将被 bash 扩展为(连同~
扩展)
cp ~/mydir/subdir1/file1 ~/mydir/subdir1/file2
一如既往,您可以使用进行测试echo
echo cp ~/mydir/subdir1/{file1,file2}
根据评论:
(1) 这可能适用于其他 shell,我没有时间全部测试。
(2) 对于“有趣”的名称,要么使用tab补全(这样bash
会进行适当的转义),要么使用引号(但不要用大括号括起来):
mv ./"some dir"/{"some name","other id"}
答案2
使用子 shell,( ... )
可以chdir
进入所需的目录,如果chdir
没有失败,则执行复制。只chdir
影响子 shell 的工作目录,而不影响父 shell 进程的工作目录。
( cd ~/mydir/subdir && cp file1 file2 )
这可以毫不费力地抽象成一个 shell 函数,并且相对于偏移工作目录(至少对于 ZSH 而言),制表符补全并不困难。
答案3
使用find
with -execdir
(如果支持,最初来自 BSD,但也受 GNU 支持find
)
但指定的命令是从包含匹配文件的子目录运行的
例如
find ~/mydir/subdir/file1 -prune -execdir cp "{}" file2 \;
(-prune
以确保如果曾经file1
是类型目录,find
最终不会将每个文件复制到file2
;如果要求复制没有/ 的cp
目录,无论如何都会抱怨)。-r
-a
答案4
互动式,有一个icp
类似 的命令imv
,它为您提供带有文件名的 readline 编辑环境。它位于“renameutils”包中。请参阅手册页
...$ icp ~/foo/bar/baz
> /home/user/foo/bar/baz # edit this and hit return. it runs cp for you
编辑时可以使用制表符完成功能,至少在路径不包含空格的情况下如此。不幸的是,这些似乎都失败了。
如果目标文件存在,它们会在覆盖目标文件之前进行提示。
icp
并imv
有一些默认选项分别传递给cp
或mv
,包括cp
's --no-preserve
(时间戳等属性)。
或者,行编辑功能使复制路径变得非常容易和快速,无需打字再来一次。
首先输入
cp ~/mydir/subdir/
(选项卡补全可用)如果路径不包含空格,则单个 ctrl-w 将“杀死”它,并将其存储在终止环中。如果有空格,则需要超过 1 个,如果您过度调整并杀死了
cp
,即使您使用 ctrl-/ 撤消过度调整,它也将成为终止环条目的一部分。或者按 ctrl-a、ctrl-right-arrow 将光标放在 后面
cp
,然后按 ctrl-k 杀死到行尾。拉回你用 ctrl-y 杀死的内容,这样你的命令行就回到了步骤 1,但目录已准备好粘贴
输入源文件名(选项卡补全可用)
击中空间,然后使用 ctrl-y 复制路径的另一个副本。现在你的命令行看起来像
cp ~/mydir/subdir/file1 ~/mydir/subdir/
键入最终文件名(选项卡补全可用)
相同的构建块可以按其他顺序使用。例如,如果您开始键入或复制/粘贴包括文件名的源路径,并且只有在您意识到您希望副本位于该目录中时,才可以在终止/拉出目录之前按 ctrl-左箭头将光标向后移动部分,然后 ctrl-e 表示行尾,然后再拉出它的另一个副本。
或者如果你想为副本指定相似的文件名,kill / 2x 复制整个路径(包括文件名),然后编辑第二个副本(目标)。同样,制表符补全功能在所有阶段都可用。
如果你不小心杀死了其他东西,那么 ctrl-y 会拉出错误的东西,alt-y 会循环返回之前的kill-ring条目。
这些交互式行编辑工具始终非常有用,而不仅仅是针对cp
.按“单词”移动光标以及删除向前/向后单词,对于快速编辑和复制路径非常有用。