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

Nag*_*gev 5 bash cp

假设我在某个目录(例如 home)下有这样的路径:~/mydir/subdir/file1,并且我想复制file1

我们可以从主目录执行此操作:

cp ~/mydir/subdir/file1 ~/mydir/subdir/file2
Run Code Online (Sandbox Code Playgroud)

是否有一个快捷方式表示“与源在同一路径中”,这样我就不必mydir/subdir再次重复该部分,就像.表示当前目录一样?或者另一种方法可以达到相同的结果?

我知道我可以cd ~/mydir/subdir先,但我正在寻找一种单行解决方案,可以让我保留在同一目录中。一种选择是使用变量,但我希望在输入大量命令时有一种更优雅的方式。

在网上查看man cp并搜索但找不到这样的选项。如果答案是明确的“否”,那也没关系,我只是想检查一下其他人是否使用了节​​省时间的技巧。谢谢!

Arc*_*mar 12

使用bash(1),并假设路径没有空格或换行(2),我会使用

cp ~/mydir/subdir1/{file1,file2}
Run Code Online (Sandbox Code Playgroud)

这将被 bash 扩展为(连同~扩展)

cp ~/mydir/subdir1/file1 ~/mydir/subdir1/file2
Run Code Online (Sandbox Code Playgroud)

一如既往,您可以使用进行测试echo

echo cp ~/mydir/subdir1/{file1,file2}
Run Code Online (Sandbox Code Playgroud)

根据评论:

(1) 这可能适用于其他 shell,我没有时间全部测试。

(2) 对于“有趣”的名称,要么使用tab补全(这样bash会进行适当的转义),要么使用引号(但不要用大括号括起来):

mv ./"some dir"/{"some name","other id"}
Run Code Online (Sandbox Code Playgroud)

  • 只需要引用大括号扩展的内部(但不是大括号)。像 `mv ./"some dir"/{"some name","other id"}` 这样的东西应该可以工作 (3认同)
  • 请注意,该语法来自 70 年代末的 csh,它不是 bash 特有的,并且现在大多数 shell 都支持它。 (2认同)

thr*_*rig 7

使用子 shell,( ... )可以chdir进入所需的目录,如果chdir没有失败,则执行复制。只chdir影响子 shell 的工作目录,而不影响父 shell 进程的工作目录。

( cd ~/mydir/subdir && cp file1 file2 )
Run Code Online (Sandbox Code Playgroud)

这可以毫无困难地抽象为 shell 函数,并且相对于偏移工作目录(至少对于 ZSH 来说),制表符补全并不难。

  • 对于 GNU `env`,另请参阅 `env -C ~/mydir/subdir cp file1 file2` (5认同)

小智 5

使用findwith -execdir(如果支持,最初来自 BSD,但也受 GNU 支持find

但指定的命令是从包含匹配文件的子目录运行的

例如

find ~/mydir/subdir/file1 -prune -execdir cp "{}" file2 \;
Run Code Online (Sandbox Code Playgroud)

-prune以确保如果是目录file1类型,最终不会将每个文件复制到;如果要求复制不带/的目录,在任何情况下都会抱怨)。findfile2cp-r-a