将一个文件从 /a/b/c/d.txt 移动到 /x/a/b/c/d.txt ,如果不存在则创建完整的树

将一个文件从 /a/b/c/d.txt 移动到 /x/a/b/c/d.txt ,如果不存在则创建完整的树

我正在遍历目录并将旧文件移动到不同的位置。例如。/a/b/c/d.txt位于我想要/x/a/b/c/d.txt无错误地移动到的路径中的文件。是否可以通过单个命令实现?如果mv不起作用,那么cp和的组合rm会起作用吗?

  • 一次只需要移动一个文件。
  • 如果 dest 树已经存在,那么它不应该引发错误。
  • 如果 dest 树不存在,则创建。

这个帖子似乎没有满足要求。我也可以通过多行代码来完成此操作。那么是否可以有一种预定义的单行选项呢? (想要将其与编程语言集成)

答案1

如果您只需要使用标准命令,可能不是您正在寻找的内容,但rsync可能会有所帮助:

$ mkdir a a/b a/b/c; echo foo >a/b/c/d.txt; tree a
a
└── b
    └── c
        └── d.txt

2 directories, 1 file
$ rsync --relative --remove-source-files a/b/c/d.txt x/
$ tree a x
a
└── b
    └── c
x
└── a
    └── b
        └── c
            └── d.txt

5 directories, 1 file

来自手动的

--relative, -R

使用相对路径。这意味着命令行上指定的完整路径名将发送到服务器,而不仅仅是文件名的最后部分。 ...

--remove-source-files

这告诉 rsync 从发送端删除属于传输一部分且已在接收端成功复制的文件(即非目录)。

相关内容