假设我在某个目录(例如 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)
使用子 shell,( ... )
可以chdir
进入所需的目录,如果chdir
没有失败,则执行复制。只chdir
影响子 shell 的工作目录,而不影响父 shell 进程的工作目录。
( cd ~/mydir/subdir && cp file1 file2 )
Run Code Online (Sandbox Code Playgroud)
这可以毫无困难地抽象为 shell 函数,并且相对于偏移工作目录(至少对于 ZSH 来说),制表符补全并不难。
小智 5
使用find
with -execdir
(如果支持,最初来自 BSD,但也受 GNU 支持find
)
但指定的命令是从包含匹配文件的子目录运行的
例如
find ~/mydir/subdir/file1 -prune -execdir cp "{}" file2 \;
Run Code Online (Sandbox Code Playgroud)
(-prune
以确保如果是目录file1
类型,最终不会将每个文件复制到;如果要求复制不带/的目录,在任何情况下都会抱怨)。find
file2
cp
-r
-a