我的目录中有一个文件/a/b/c/xxxxx.sql
我有另一个目录,/a/b/d
没有进一步的子目录。
我应该如何在单个命令中复制xxxxx.sql
到/a/b/d
, 以获得目录为 , 的新文件?/a/b/d/c/xxxxx.sql
答案1
使用install
命令:
install -D -m644 /a/b/c/xxxxx.sql /a/b/d/c/xxxxx.sql
从man install
:
install
- 复制文件并设置属性
644
您可以通过修改您想要的内容来选择 Unix 权限,默认是755
因为该命令主要用于软件部署。被umask
忽略。
该命令将透明地创建所有目录结构(如果不存在)-D
:
-D
DEST
创建除最后一个之外的所有前导组件,或 的所有组件--target-directory
,然后复制SOURCE
到DEST
rwxr-xr-x
无论.755
umask
已经存在的目录的权限不会被修改。
答案2
使用 GNU cp,从您希望在新目录中看到的路径的起点进行复制,并使用以下选项--parents
:
cd /a/b &&
cp --parents c/foo d
例子:
% cp --parents c/foo d --verbose
c -> d/c
'c/foo' -> 'd/c/foo'
使其成为单个命令:
{ cd /a/b && cp --parents c/foo d; } # compound command
env -C /a/b cp --parents c/foo d # simple command assuming BSD/GNU env
使用-a
,将从源复制目录和文件cp
的所有属性,包括文件类型、权限、ACL、扩展属性、稀疏性和所有权(如果系统允许)。c
foo
答案3
您可以使用同步相对选项。
rsync --relative /a/b/./c/xxxxx.sql /a/b/d/
请注意,.
分隔路径应从何处--relative
开始。
要移动整个目录 ( c
),请不要忘记添加--recursive
标志以递归复制这些文件。
答案4
您也可以推出自己的命令。这是一个函数实现,但您同样可以将其变体放入可执行脚本中的某个位置$PATH
mdcopy() {
mkdir -p -- "$2" &&
cp -p -- "$1" "$2"
}
用法
mdcopy /a/b/c/xxxxx.sql /a/b/d/c
这种方法的一个优点是您可以得到您想要的实用程序。此实现需要一个目录作为其第二个参数,但您同样可以对其进行调整以期望文件路径名作为第二个参数。这是最适合你的。