复制文件并创建目录

复制文件并创建目录

我的目录中有一个文件/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,然后复制SOURCEDEST

rwxr-xr-x无论.755umask​已经存在的目录的权限不会被修改。

答案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、扩展属性、稀疏性和所有权(如果系统允许)。cfoo

答案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

这种方法的一个优点是您可以得到您想要的实用程序。此实现需要一个目录作为其第二个参数,但您同样可以对其进行调整以期望文件路径名作为第二个参数。这是最适合你的。

相关内容