复制文件并创建目录

Sid*_*ani 10 file-copy

我的目录中有一个文件/a/b/c/xxxxx.sql

我有另一个目录,/a/b/d没有进一步的子目录。

我应该如何在单个命令中复制xxxxx.sql/a/b/d, 以获得目录为 , 的新文件?/a/b/d/c/xxxxx.sql

Gil*_*not 19

使用install命令:

install -D -m644 /a/b/c/xxxxx.sql /a/b/d/c/xxxxx.sql
Run Code Online (Sandbox Code Playgroud)

man install

install- 复制文件并设置属性

644您可以通过修改您想要的内容来选择 Unix 权限,默认是755因为该命令主要用于软件部署。被umask忽略。

该命令将透明地创建所有目录结构(如果不存在)-D

-D

创建除最后一个之外的所有前导组件DEST,或 的所有组件--target-directory,然后复制SOURCEDEST

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


mur*_*uru 12

使用 GNU cp,从您希望在新目录中看到的路径的起点进行复制,并使用以下--parents选项:

cd /a/b &&
  cp --parents c/foo d
Run Code Online (Sandbox Code Playgroud)

例子:

% cp --parents c/foo d --verbose
c -> d/c
'c/foo' -> 'd/c/foo'
Run Code Online (Sandbox Code Playgroud)

使其成为单个命令:

{ 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
Run Code Online (Sandbox Code Playgroud)

使用-acp将从源复制目录和文件的所有属性,包括文件类型、权限、ACL、扩展属性、稀疏性和所有权(如果系统允许cfoo


小智 8

您可以使用rsync相对选项。

rsync --relative /a/b/./c/xxxxx.sql /a/b/d/
Run Code Online (Sandbox Code Playgroud)

请注意,.分隔--relative路径应从何处开始。

要移动整个目录 ( c),请不要忘记添加--recursive标志以递归复制这些文件。

  • @SiddharthSomani,该错误消息表明它是由 sh 而不是 rsync 执行的,并且 rsync 不运行 `sh`。许多语言的“system()”函数确实会调用 sh,但确切的命令行不会触发 EISDIR 错误。可能您有 `rsync -R /a/b/./c/xxxxx.sql > /a/b/d/` 而不是 `rsync -R /a/b/./c/xxxxx.sql /a/b /d/`。 (3认同)

Jim*_* L. 5

除了 rsync 之外,tar还会执行您需要的操作:

tar cf - -C /a/b c/xxxxxx.sql | tar xpf - -C /a/b/d
Run Code Online (Sandbox Code Playgroud)

一个例子:

$ mkdir -p /a/b/c /a/b/d
$ touch /a/b/c/xxxxxx.sql
$ tar cf - -C /a/b c/xxxxxx.sql | tar xpf - -C /a/b/d
$ find /a/b
/a/b
/a/b/c
/a/b/c/xxxxxx.sql
/a/b/d
/a/b/d/c
/a/b/d/c/xxxxxx.sql
Run Code Online (Sandbox Code Playgroud)