将文件复制到与源相同的路径而不更改目录

将文件复制到与源相同的路径而不更改目录

假设我在某个目录(例如 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

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

编辑时可以使用制表符完成功能,至少在路径不包含空格的情况下如此。不幸的是,这些似乎都失败了。

如果目标文件存在,它们会在覆盖目标文件之前进行提示。

icpimv有一些默认选项分别传递给cpmv,包括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.按“单词”移动光标以及删除向前/向后单词,对于快速编辑和复制路径非常有用。

相关内容